From: Dan Timoney Date: Wed, 19 Jul 2017 00:23:07 +0000 (-0400) Subject: [CCSDK-6] Populate seed code X-Git-Tag: v0.1.0~58 X-Git-Url: https://gerrit.onap.org/r/gitweb?a=commitdiff_plain;h=5363b2782d906a6c6067eb840392f959ed4dfe4b;p=ccsdk%2Fsli%2Fadaptors.git [CCSDK-6] Populate seed code Add seed code for sli/adaptors repository Update code to use org.onap.ccsdk.sli.core Change-Id: I477c7a24f2cc1fed8fb0975fe9f33733411c27f9 Signed-off-by: Dan Timoney --- diff --git a/.gitignore b/.gitignore new file mode 100755 index 00000000..2932cb92 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +#####standard .git ignore entries##### + +## IDE Specific Files ## +org.eclipse.core.resources.prefs +.classpath +.project +.settings +.idea +.externalToolBuilders +maven-eclipse.xml +workspace +.checkstyle + +## Compilation Files ## +*.class +**/target +target +target-ide +MANIFEST.MF + +## Misc Ignores (OS specific etc) ## +bin/ +dist +*~ +*.ipr +*.iml +*.iws +classes +out/ +.DS_STORE +.metadata +provider/src/main/java/META-INF/ +provider/src/main/java/inventory/ + +## BlackDuck generated file +sdnc-adaptors_bdio.jsonld +blackDuckHubProjectName.txt +blackDuckHubProjectVersionName.txt diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..3ea5081a --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,22 @@ +/* + * ============LICENSE_START========================================== + * =================================================================== + * Copyright © 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============================================ + * + * ECOMP and OpenECOMP are trademarks + * and service marks of AT&T Intellectual Property. + * + */ diff --git a/README.md b/README.md new file mode 100644 index 00000000..c1e7af92 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +This source repository contains the code for the SDN Controller adaptors. +To compile this code: + +1. Make sure your local Maven settings file ($HOME/.m2/settings.xml) contains references to the OpenECOMP repositories and OpenDaylight repositories. See example-settings.xml for an example. + +2. To compile, run "mvn clean install". + + diff --git a/aai-service/.gitignore b/aai-service/.gitignore new file mode 100755 index 00000000..b73caf31 --- /dev/null +++ b/aai-service/.gitignore @@ -0,0 +1,34 @@ +#####standard .git ignore entries##### + +## IDE Specific Files ## +org.eclipse.core.resources.prefs +.classpath +.project +.settings +.idea +.externalToolBuilders +maven-eclipse.xml +workspace + +## Compilation Files ## +*.class +**/target +target +target-ide +MANIFEST.MF + +## Misc Ignores (OS specific etc) ## +bin/ +dist +*~ +*.ipr +*.iml +*.iws +classes +out/ +.DS_STORE +.metadata + +## Folders which contain auto generated source code ## +yang-gen-config +yang-gen-sal diff --git a/aai-service/README.md b/aai-service/README.md new file mode 100755 index 00000000..e69de29b diff --git a/aai-service/features/pom.xml b/aai-service/features/pom.xml new file mode 100755 index 00000000..3127bd9c --- /dev/null +++ b/aai-service/features/pom.xml @@ -0,0 +1,155 @@ + + + 4.0.0 + + aai-service + org.openecomp.sdnc.adaptors + 0.0.1-SNAPSHOT + + aai-service-features + AAI Interface Service - Features + + jar + + + + + + org.openecomp.sdnc.adaptors + aai-service-provider + ${project.version} + + + + org.opendaylight.mdsal + features-mdsal + ${odl.mdsal.features.version} + features + xml + + runtime + + + + + + org.opendaylight.odlparent + opendaylight-karaf-empty + ${odl.karaf.empty.distro.version} + zip + + + + + + org.opendaylight.odlparent + features-test + ${odl.commons.opendaylight.version} + test + + + + org.opendaylight.yangtools + features-yangtools + ${odl.yangtools.version} + features + xml + runtime + + + + com.sun.jersey + jersey-client + 1.17 + + + com.sun.jersey + jersey-core + 1.17 + + + commons-lang + commons-lang + 2.6 + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-annotations + + + com.fasterxml.jackson.core + jackson-core + + + + + + + true + src/main/resources + + + + + org.apache.maven.plugins + maven-resources-plugin + + + filter + + resources + + generate-resources + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + attach-artifacts + + attach-artifact + + package + + + + ${project.build.directory}/classes/${features.file} + xml + features + + + + + + + + + diff --git a/aai-service/features/src/main/resources/features.xml b/aai-service/features/src/main/resources/features.xml new file mode 100644 index 00000000..2f3ac734 --- /dev/null +++ b/aai-service/features/src/main/resources/features.xml @@ -0,0 +1,46 @@ + + + + + + + mvn:org.opendaylight.mdsal/features-mdsal/${odl.mdsal.features.version}/xml/features + + + + odl-mdsal-broker + sdnc-sli + mvn:org.openecomp.sdnc.adaptors/aai-service-provider/${project.version} + mvn:com.sun.jersey/jersey-client/${jersey.client.version} + mvn:com.sun.jersey/jersey-core/${jersey.version} + mvn:org.apache.httpcomponents/httpcore-osgi/${apache.httpcomponents.version} + mvn:org.apache.httpcomponents/httpclient-osgi/${apache.httpcomponents.version} + mvn:com.fasterxml.jackson.core/jackson-databind/${jackson.version} + mvn:com.fasterxml.jackson.core/jackson-annotations/${jackson.version} + mvn:com.fasterxml.jackson.core/jackson-core/${jackson.version} + mvn:commons-lang/commons-lang/${commons.lang.version} + mvn:com.fasterxml.jackson.module/jackson-module-jaxb-annotations/${jackson.version} + + + diff --git a/aai-service/installer/pom.xml b/aai-service/installer/pom.xml new file mode 100755 index 00000000..2973348b --- /dev/null +++ b/aai-service/installer/pom.xml @@ -0,0 +1,144 @@ + + + 4.0.0 + + aai-service + org.openecomp.sdnc.adaptors + 0.0.1-SNAPSHOT + + aai-service-installer + AAI Adaptor - Karaf Installer + pom + + + sdnc-aai-service + sdnc-aai-service + mvn:org.openecomp.sdnc.adaptors/aai-service-features/${project.version}/xml/features + false + + + + + + org.openecomp.sdnc.adaptors + aai-service-features + ${project.version} + features + xml + + + * + * + + + + + + org.openecomp.sdnc.adaptors + aai-service-provider + ${project.version} + + + + org.jvnet.jaxb2_commons + jaxb2-basics-runtime + ${jvnet.jaxb2.version} + + + + + + + + maven-assembly-plugin + 2.6 + + + maven-repo-zip + + single + + package + + false + stage/${application.name}-${project.version} + + src/assembly/assemble_mvnrepo_zip.xml + + false + + + + installer-zip + + single + + package + + true + ${application.name}-${project.version}-installer + + src/assembly/assemble_installer_zip.xml + + false + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + + copy-dependencies + + prepare-package + + false + ${project.build.directory}/assembly/system + false + true + true + true + false + false + org.openecomp.sdnc,org.jvnet.jaxb2_commons + sli-common,sli-provider,dblib-provider,dblib-common + provided + + + + + + maven-resources-plugin + 2.6 + + + copy-version + + copy-resources + + validate + + ${basedir}/target/stage + + + src/main/resources/scripts + + install-feature.sh + + true + + + + + + + + + + + + diff --git a/aai-service/installer/src/assembly/assemble_installer_zip.xml b/aai-service/installer/src/assembly/assemble_installer_zip.xml new file mode 100644 index 00000000..e278872a --- /dev/null +++ b/aai-service/installer/src/assembly/assemble_installer_zip.xml @@ -0,0 +1,59 @@ + + + + + + installer_zip + + zip + + + + false + + + + target/stage/ + ${application.name} + 755 + + *.sh + + + + target/stage/ + ${application.name} + 644 + + *.sh + + + + + + + diff --git a/aai-service/installer/src/assembly/assemble_mvnrepo_zip.xml b/aai-service/installer/src/assembly/assemble_mvnrepo_zip.xml new file mode 100644 index 00000000..1edacdb6 --- /dev/null +++ b/aai-service/installer/src/assembly/assemble_mvnrepo_zip.xml @@ -0,0 +1,49 @@ + + + + + + mvnrepo_zip + + zip + + + + false + + + + target/assembly/ + . + + + + + + + + diff --git a/aai-service/installer/src/main/resources/scripts/install-feature.sh b/aai-service/installer/src/main/resources/scripts/install-feature.sh new file mode 100644 index 00000000..9a47d222 --- /dev/null +++ b/aai-service/installer/src/main/resources/scripts/install-feature.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +### +# ============LICENSE_START======================================================= +# openECOMP : SDN-C +# ================================================================================ +# Copyright (C) 2017 ONAP 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========================================================= +### + +ODL_HOME=${ODL_HOME:-/opt/opendaylight/current} +ODL_KARAF_CLIENT=${ODL_KARAF_CLIENT:-${ODL_HOME}/bin/client} +ODL_KARAF_CLIENT_OPTS=${ODL_KARAF_CLIENT_OPTS:-"-u karaf"} +INSTALLERDIR=$(dirname $0) + +REPOZIP=${INSTALLERDIR}/${features.boot}-${project.version}.zip + +if [ -f ${REPOZIP} ] +then + unzip -d ${ODL_HOME} ${REPOZIP} +else + echo "ERROR : repo zip ($REPOZIP) not found" + exit 1 +fi + +${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:repo-add ${features.repositories} +${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:install ${features.boot} diff --git a/aai-service/pom.xml b/aai-service/pom.xml new file mode 100755 index 00000000..cc028b02 --- /dev/null +++ b/aai-service/pom.xml @@ -0,0 +1,45 @@ + + + + + org.openecomp.sdnc.adaptors + sdnc-adaptors + 0.0.1-SNAPSHOT + + + 4.0.0 + pom + org.openecomp.sdnc.adaptors + aai-service + + + AAI Interface Service + The AAI Interface service exposes an interface to AAI as an OSGi service + + 0.0.1-SNAPSHOT + + + + + org.openecomp.sdnc.adaptors + aai-service-features + features + ${project.version} + xml + + + + org.openecomp.sdnc.adaptors + aai-service-provider + ${project.version} + + + + + + + provider + features + installer + + diff --git a/aai-service/provider/pom.xml b/aai-service/provider/pom.xml new file mode 100755 index 00000000..d6d72f20 --- /dev/null +++ b/aai-service/provider/pom.xml @@ -0,0 +1,216 @@ + + + 4.0.0 + + org.openecomp.sdnc.adaptors + aai-service + 0.0.1-SNAPSHOT + + aai-service-provider + bundle + AAI Interface Service - Provider + http://maven.apache.org + + UTF-8 + + + + junit + junit + ${junit.version} + test + + + org.mockito + mockito-all + ${mockito.version} + test + + + org.onap.ccsdk.sli.core + sli-common + ${sdnctl.sli.version} + compile + + + org.onap.ccsdk.sli.core + sli-provider + ${sdnctl.sli.version} + compile + + + equinoxSDK381 + org.eclipse.osgi + ${equinox.osgi.version} + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + jcl-over-slf4j + ${slf4j.version} + + + com.sun.jersey + jersey-client + ${jersey.client.version} + + + com.sun.jersey + jersey-core + ${jersey.version} + + + org.apache.httpcomponents + httpcore-osgi + ${apache.httpcomponents.core.version} + + + org.apache.httpcomponents + httpclient-osgi + ${apache.httpcomponents.client.version} + + + com.fasterxml.jackson.core + jackson-databind + + ${jackson.version} + + + com.fasterxml.jackson.module + jackson-module-jaxb-annotations + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-annotations + + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-core + + ${jackson.version} + + + commons-lang + commons-lang + ${commons.lang.version} + + + org.jvnet.jaxb2_commons + jaxb2-basics-runtime + 0.6.4 + + + org.jsoup + jsoup + 1.8.3 + test + + + org.springframework + spring-core + 4.3.5.RELEASE + test + + + + + + + org.apache.felix + maven-bundle-plugin + ${bundle.plugin.version} + true + + + org.openecomp.sdnc.sli.aai + org.openecomp.sdnc.sli.aai.AAIServiceActivator + org.openecomp.sdnc.sli.aai.*,org.openecomp.aai.inventory.v10.* + org.openecomp.sdnc.sli.*,org.osgi.framework.*,org.slf4j.*,org.apache.commons.lang3.*,javax.xml.bind.annotation.*,javax.ws.rs.*,javax.ws.rs.core.*,com.fasterxml.jackson.module.jaxb.*,com.sun.jersey.client.urlconnection.*,com.sun.jersey.api.client.config.*,com.fasterxml.jackson.databind.type.*,com.fasterxml.jackson.module.jaxb.*,com.fasterxml.jackson.databind.introspect.*,com.fasterxml.jackson.annotation.*,com.fasterxml.jackson.databind.* + * + true + + + ${project.basedir}/src/main/resources/META-INF + + + + org.jvnet.jaxb2.maven2 + maven-jaxb2-plugin + 0.13.1 + + + gen-xjc + + generate + + + + + ${project.basedir}/src/main/resources + + aai_schema_v10.xsd + + + aai-schema-bindings.xjb + + ${project.build.directory}/generated-sources/main/java + org.openecomp.aai.inventory.v10 + true + + -Xannotate + + + + org.jvnet.jaxb2_commons + jaxb2-basics-annotate + 0.6.4 + + + + + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + + com.brocade.developer + + + providermodule-plugin + + + [1.2.0.100-SNAPSHOT,) + + + process + + + + + + + + + + + + + + diff --git a/aai-service/provider/src/main/java/META-INF/sun-jaxb.episode b/aai-service/provider/src/main/java/META-INF/sun-jaxb.episode new file mode 100755 index 00000000..f14c7d47 --- /dev/null +++ b/aai-service/provider/src/main/java/META-INF/sun-jaxb.episode @@ -0,0 +1,376 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIClient.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIClient.java new file mode 100644 index 00000000..05921203 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIClient.java @@ -0,0 +1,220 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.IOException; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource.QueryStatus; +import org.openecomp.aai.inventory.v10.AvailabilityZone; +import org.openecomp.aai.inventory.v10.Complex; +import org.openecomp.aai.inventory.v10.CtagPool; +import org.openecomp.aai.inventory.v10.DvsSwitch; +import org.openecomp.aai.inventory.v10.GenericVnf; +import org.openecomp.aai.inventory.v10.L3Network; +import org.openecomp.aai.inventory.v10.OamNetwork; +import org.openecomp.aai.inventory.v10.PInterface; +import org.openecomp.aai.inventory.v10.PhysicalLink; +import org.openecomp.aai.inventory.v10.Pserver; +import org.openecomp.aai.inventory.v10.SearchResults; +import org.openecomp.aai.inventory.v10.Service; +import org.openecomp.aai.inventory.v10.ServiceInstance; +import org.openecomp.aai.inventory.v10.SitePairSet; +import org.openecomp.aai.inventory.v10.Tenant; +import org.openecomp.aai.inventory.v10.Vce; +import org.openecomp.aai.inventory.v10.VnfImage; +import org.openecomp.aai.inventory.v10.Vpe; +import org.openecomp.aai.inventory.v10.VplsPe; +import org.openecomp.aai.inventory.v10.VpnBinding; +import org.openecomp.aai.inventory.v10.Vserver; +import org.openecomp.sdnc.sli.aai.data.notify.NotifyEvent; +import org.openecomp.sdnc.sli.aai.data.v1507.VServer; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; + +public interface AAIClient extends SvcLogicResource, SvcLogicJavaPlugin { + + // VCE + public boolean postNetworkVceData(String vnf_id, Vce request) throws AAIServiceException; + public Vce requestNetworkVceData(String vnf_id) throws AAIServiceException; + public boolean deleteNetworkVceData(String vnf_id, String resourceVersion) throws AAIServiceException; + + // Service Inteface + public ServiceInstance requestServiceInterfaceData(String customer_id, String service_type, String svc_instance_id) throws AAIServiceException; + public boolean postServiceInterfaceData(String customer_id, String service_type, String svc_instance_id, ServiceInstance request) throws AAIServiceException; + public SearchResults requestServiceInstanceURL(String svc_instance_id) throws AAIServiceException; + + // VPE +// public Vpes requestNetworkVpeList() throws AAIServiceException; + public Vpe requestNetworkVpeData(String vnf_id) throws AAIServiceException; + public boolean postNetworkVpeData(String vnf_id, Vpe request) throws AAIServiceException; + public boolean deleteNetworkVpeData(String vnf_id, String resourceVersion) throws AAIServiceException; + + // VServers + public Vserver requestVServerData(String tenant_id, String vserver_id, String cloudOwner, String cloudRegionId) throws AAIServiceException; + public boolean postVServerData(String tenantId, String vserverId, String cloudOwner, String cloudRegionId, Vserver request) throws AAIServiceException; + public boolean deleteVServerData(String tenant_id, String vserver_id, String cloudOwner, String cloudRegionId, String resourceVersion) throws AAIServiceException; + + public URL requestVserverURLNodeQuery(String vserver_name) throws AAIServiceException; + public String getTenantIdFromVserverUrl(URL url); + public String getCloudOwnerFromVserverUrl(URL url); + public String getCloudRegionFromVserverUrl(URL url); + public String getVServerIdFromVserverUrl(URL url, String tennantId); + public Vserver requestVServerDataByURL(URL url) throws AAIServiceException; + + // VPLS-PE + public VplsPe requestNetworkVplsPeData(String equipment_name) throws AAIServiceException; + public boolean postNetworkVplsPeData(String vnf_id, VplsPe request) throws AAIServiceException; + public boolean deleteNetworkVplsPeData(String vnf_id, String resourceVersion) throws AAIServiceException; + + + // Complexes + public Complex requestNetworkComplexData(String vnf_id) throws AAIServiceException; + public boolean postNetworkComplexData(String vnf_id, Complex request) throws AAIServiceException; + public boolean deleteNetworkComplexData(String vnf_id, String resourceVersion) throws AAIServiceException; + + // CTag Pool + public CtagPool requestCtagPoolData(String physical_location_id, String target_pe, String availability_zone_name) throws AAIServiceException; + + // --------------------------------- 1507 --------------------------- + // Data Change + public VServer dataChangeRequestVServerData(URL url) throws AAIServiceException; + + public CtagPool dataChangeRequestCtagPoolData(URL url) throws AAIServiceException; + + public VplsPe dataChangeRequestVplsPeData(URL url) throws AAIServiceException; + + public Vpe dataChangeRequestVpeData(URL url) throws AAIServiceException; + + public DvsSwitch dataChangeRequestDvsSwitchData(URL url) throws AAIServiceException; + + public Pserver dataChangeRequestPServerData(URL url) throws AAIServiceException; + + //OAM-Network: + public OamNetwork dataChangeRequestOAMNetworkData(URL url) throws AAIServiceException; + //Availability-Zone: + public AvailabilityZone dataChangeRequestAvailabilityZoneData(URL url) throws AAIServiceException; + //Complex: + public Complex dataChangeRequestComplexData(URL url) throws AAIServiceException; + + + /* DELETE */ + public boolean dataChangeDeleteVServerData(URL url) throws AAIServiceException; + + public boolean dataChangeDeleteCtagPoolData(URL url) throws AAIServiceException; + + public boolean dataChangeDeleteVplsPeData(URL url) throws AAIServiceException; + + public boolean dataChangeDeleteVpeData(URL url) throws AAIServiceException; + + public boolean dataChangeDeleteDvsSwitchData(URL url) throws AAIServiceException; + //OAM-Network: + public boolean dataChangeDeleteOAMNetworkData(URL url) throws AAIServiceException; + //Availability-Zone: + public boolean dataChangeDeleteAvailabilityZoneData(URL url) throws AAIServiceException; + //Complex: + public boolean dataChangeDeleteComplexData(URL url) throws AAIServiceException; + + // ----------------- Release 1510 ---------------------- + // // GenericVNF + public GenericVnf requestGenericVnfData(String vnf_id) throws AAIServiceException; + public boolean postGenericVnfData(String vnf_id, GenericVnf request) throws AAIServiceException; + public boolean deleteGenericVnfData(String vnf_id, String resourceVersion) throws AAIServiceException; + + // DvsSwitch + public DvsSwitch requestDvsSwitchData(String vnf_id) throws AAIServiceException; + public boolean postDvsSwitchData(String vnf_id, DvsSwitch request) throws AAIServiceException; + public boolean deleteDvsSwitchData(String vnf_id, String resourceVersion) throws AAIServiceException; + + // PInterface + public PInterface requestPInterfaceData(String hostname, String interfaceName) throws AAIServiceException; + public boolean postPInterfaceData(String hostname, String interfaceName, PInterface request) throws AAIServiceException; + public boolean deletePInterfaceData(String hostname, String interfaceName, String resourceVersion) throws AAIServiceException; + + // Physical Link + public PhysicalLink requestPhysicalLinkData(String vnf_id) throws AAIServiceException; + public boolean postPhysicalLinkData(String vnf_id, PhysicalLink request) throws AAIServiceException; + public boolean deletePhysicalLinkData(String vnf_id, String resourceVersion) throws AAIServiceException; + + // PServers + public Pserver requestPServerData(String hostname) throws AAIServiceException; + public boolean postPServerData(String hostname, Pserver server) throws AAIServiceException; + public boolean deletePServerData(String hostname, String resourceVersion) throws AAIServiceException; + + // L3Networks + public L3Network requestL3NetworkData(String networkId) throws AAIServiceException; + public L3Network requestL3NetworkQueryByName(String networkId) throws AAIServiceException; + public boolean postL3NetworkData(String networkId, L3Network request) throws AAIServiceException; + public boolean deleteL3NetworkData(String networkId, String resourceVersion) throws AAIServiceException; + + // Vpn Bindings + public VpnBinding requestVpnBindingData(String vpnId) throws AAIServiceException; +// public boolean postVpnBindingData(String vpnId, VpnBinding request) throws AAIServiceException; + public boolean deleteVpnBindingData(String vpnId, String resourceVersion) throws AAIServiceException; + + //VnfImage + public VnfImage requestVnfImageData(String vpnId) throws AAIServiceException; + public VnfImage requestVnfImageDataByVendorModel(String vendor, String model) throws AAIServiceException; + public VnfImage requestVnfImageDataByVendorModelVersion(String vendor, String model, String version) throws AAIServiceException; + + // UBB Notify + public boolean sendNotify(NotifyEvent event, String serviceInstanceId, String pathCode) throws AAIServiceException; + + // 1512 + // Site Pair Site + public SitePairSet requestSitePairSetData(String sitePairSetId) throws AAIServiceException; + public boolean postSitePairSetData(String sitePairSetId, SitePairSet request) throws AAIServiceException; + public boolean deleteSitePairSetData(String sitePairSetId, String resourceVersion) throws AAIServiceException; + + // Services + public Service requestServiceData(String serviceId) throws AAIServiceException; + public boolean postServiceData(String serviceId, Service request) throws AAIServiceException; + public boolean deleteServiceData(String serviceId, String resourceVersion) throws AAIServiceException; + + // Node Query - 1602 + public SearchResults requestNodeQuery(String type, String entityIdentifier, String entityName) throws AAIServiceException; + public String requestDataByURL(URL url) throws AAIServiceException; +// public Object requestDataInstanceNodeQuery(String type, String vnf_name) throws AAIServiceException; + public GenericVnf requestGenericVnfeNodeQuery(String vnf_name) throws AAIServiceException; + + // // tenant + public Tenant requestTenantData(String tenant_id, String cloudOwner, String cloudRegionId) throws AAIServiceException; + public Tenant requestTenantDataByName(String tenant_name, String cloudOwner, String cloudRegionId) throws AAIServiceException; + public boolean postTenantData(String tenant_id, String cloudOwner, String cloudRegionId, Tenant request) throws AAIServiceException; +// public boolean deleteGenericVnfData(String vnf_id, String resourceVersion) throws AAIServiceException; + + + public QueryStatus backup(Map params, SvcLogicContext ctx) throws SvcLogicException; + public QueryStatus restore(Map params, SvcLogicContext ctx) throws SvcLogicException; + + public void logKeyError(String keys); + + public QueryStatus processResponseData(String rv, String resource, AAIRequest request, String prefix, SvcLogicContext ctx, HashMap nameValues, String modifier) throws JsonParseException, JsonMappingException, IOException, AAIServiceException ; + +} 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 00000000..cee0847b --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIDeclarations.java @@ -0,0 +1,2045 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.IOException; +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.net.URLDecoder; +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.lang.StringUtils; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource.QueryStatus; +import org.openecomp.aai.inventory.v10.GenericVnf; +import org.openecomp.aai.inventory.v10.InventoryResponseItem; +import org.openecomp.aai.inventory.v10.InventoryResponseItems; +import org.openecomp.aai.inventory.v10.L3Network; +import org.openecomp.aai.inventory.v10.LogicalLink; +import org.openecomp.aai.inventory.v10.Metadata; +import org.openecomp.aai.inventory.v10.Metadatum; +import org.openecomp.aai.inventory.v10.Pnf; +import org.openecomp.aai.inventory.v10.Relationship; +import org.openecomp.aai.inventory.v10.RelationshipData; +import org.openecomp.aai.inventory.v10.RelationshipList; +import org.openecomp.aai.inventory.v10.ResultData; +import org.openecomp.aai.inventory.v10.SearchResults; +import org.openecomp.aai.inventory.v10.ServiceInstance; +import org.openecomp.aai.inventory.v10.Vlan; +import org.openecomp.aai.inventory.v10.Vlans; +import org.openecomp.aai.inventory.v10.Vserver; +import org.openecomp.sdnc.sli.aai.AAIService.AAIRequestExecutor; +import org.openecomp.sdnc.sli.aai.data.AAIDatum; +import org.openecomp.sdnc.sli.aai.query.FormattedQueryResultList; +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.query.Results; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + + +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 APPLICATION_ID = "org.openecomp.sdnc.sli.aai.application"; + + 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 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"; + + // 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"; + + // VServer + public static final String NETWORK_VSERVER_PATH = "org.openecomp.sdnc.sli.aai.path.vserver"; + + public static final String VNF_IMAGE_QUERY_PATH = "org.openecomp.sdnc.sli.aai.path.vnf.image.query"; + + 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"; + + // 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 nameValues = keyToHashMap(key, ctx); + getLogger().debug("key = "+ nameValues.toString()); + + if(!checkOldFormat(resource, nameValues)) { + ctx.setAttribute(String.format("%s.error.message", prefix), String.format("Resource %s is not supported. Key string contains invaid identifiers", resource)); + return QueryStatus.FAILURE; + } + + if(resource == null || resource.isEmpty() || AAIRequest.createRequest(resource, nameValues) == null) { + ctx.setAttribute(String.format("%s.error.message", prefix), String.format("Resource %s is not supported", resource)); + return QueryStatus.FAILURE; + } + + // 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") || nameValues.containsKey("vserver.vserver_name") || nameValues.containsKey("vserver.vserver-name")) + useNewModelProcessing = false; + } + if("generic-vnf".equals(resource)){ + if(nameValues.containsKey("vnf_name") || nameValues.containsKey("vnf-name") || nameValues.containsKey("generic_vnf.vnf_name") || nameValues.containsKey("generic-vnf.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 = AAIService.getObjectMapper(); + Map attributes = new HashMap(); + + 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"); + if(nameValues.containsKey("vnf_id")) + vnfId = nameValues.get("vnf_id"); + else if(nameValues.containsKey("generic_vnf.vnf_name")) + vnfId = nameValues.get("generic_vnf.vserver_name"); + + if(nameValues.containsKey("vnf_name")) + vnfName = nameValues.get("vnf_name"); + else if(nameValues.containsKey("generic_vnf.vnf_name")) + vnfName = nameValues.get("generic_vnf.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 = null; + if(nameValues.containsKey("vserver_name")) + vserverName = nameValues.get("vserver_name"); + else if(nameValues.containsKey("vserver.vserver_name")) + vserverName = nameValues.get("vserver.vserver_name"); + + String vserverId = null; + if(nameValues.containsKey("vserver_id")) + vserverId = nameValues.get("vserver_id"); + if(nameValues.containsKey("vserver.vserver_id")) + vserverId = nameValues.get("vserver.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) { + URL vserverUrl = null; + try { + vserverUrl = this.requestVserverURLNodeQuery(vserverName); + } catch (AAIServiceException aaiexc) { + ctx.setAttribute(prefix + ".error.message", aaiexc.getMessage()); + if (aaiexc.getReturnCode() >= 300) { + ctx.setAttribute(prefix + ".error.http.response-code", "" + aaiexc.getReturnCode()); + } + + if (aaiexc.getReturnCode() == 404) + return QueryStatus.NOT_FOUND; + else + return QueryStatus.FAILURE; + } + if (vserverUrl == null) { + return QueryStatus.NOT_FOUND; + } + + tenantId = getTenantIdFromVserverUrl(vserverUrl); + String cloudOwner = getCloudOwnerFromVserverUrl(vserverUrl); + String cloudRegionId = getCloudRegionFromVserverUrl(vserverUrl); + + Vserver vserver = null; + try { + vserver = this.requestVServerDataByURL(vserverUrl); + } catch (AAIServiceException aaiexc) { + ctx.setAttribute(prefix + ".error.message", aaiexc.getMessage()); + if (aaiexc.getReturnCode() >= 300) { + ctx.setAttribute(prefix + ".error.http.response-code", "" + aaiexc.getReturnCode()); + } + + if (aaiexc.getReturnCode() == 404) + return QueryStatus.NOT_FOUND; + else + return QueryStatus.FAILURE; + } + 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); + } + } 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 keys = new ArrayList(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 properties = (Map)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; + } + + private boolean checkOldFormat(String resource, HashMap nameValues) { + + switch(resource){ + case "formatted-query": + case "generic-query": + case "named-query": + case "nodes-query": + case "linterface": + case "l2-bridge-sbg": + case "l2-bridge-bgf": + case "echo": + case "test": + return true; + } + if(resource.contains(":")) { + resource = resource.substring(0, resource.indexOf(":")); + } + + Set keys = nameValues.keySet(); + for(String key : keys) { + if(!key.contains(".")) { + if("depth".equals(key) || "related-to".equals(key) || "related_to".equals(key)) + continue; + else { + getLogger().warn(String.format("key %s is incompatible with resource type '%s'", key, resource)); + return false; + } + } + } + return true; + } + + public void writeMap(Map properties, String prefix, SvcLogicContext ctx) { + Set 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 || entity instanceof Long || entity instanceof Integer || entity instanceof Boolean) { + 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)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)entity, prefix + "[" + i + "]", ctx); + } else + if(entity instanceof String || entity instanceof Long || entity instanceof Integer || entity instanceof Boolean) { + 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 params, String prefix, SvcLogicContext ctx) + throws SvcLogicException { + + getLogger().debug("AAIService.save\tresource="+resource); + HashMap nameValues = keyToHashMap(key, ctx); + + if(!checkOldFormat(resource, nameValues)) { + ctx.setAttribute(String.format("%s.error.message", prefix), String.format("Resource %s is not supported. Key string contains invaid identifiers", resource)); + return QueryStatus.FAILURE; + } + + if(resource == null || resource.isEmpty() || AAIRequest.createRequest(resource, nameValues) == null) { + getLogger().warn("AAIService.save has unspecified resource"); + ctx.setAttribute(String.format("%s.error.message", prefix), String.format("Resource %s is not supported", resource)); + return QueryStatus.FAILURE; + } + // keys passed + getLogger().debug("key = "+ Arrays.toString(nameValues.entrySet().toArray())); + + // process params + if(params.containsKey("prefix")) { + Map 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) { + // TODO : Fix this + 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]; + + 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); + + getExecutor().post(request); + getLogger().debug("Save relationship list - returning SUCCESS"); + return QueryStatus.SUCCESS; + } + } 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 params, String prefix, SvcLogicContext ctx) throws SvcLogicException { + + resource = resource.toLowerCase(); + HashMap nameValues = keyToHashMap(key, ctx); + getLogger().debug("key = "+ Arrays.toString(nameValues.entrySet().toArray())); + if(!checkOldFormat(resource, nameValues)) { + ctx.setAttribute(String.format("%s.error.message", prefix), String.format("Resource %s is not supported. Key string contains invaid identifiers", resource)); + return QueryStatus.FAILURE; + } + + if(resource == null || resource.isEmpty() || AAIRequest.createRequest(resource, nameValues) == null) { + ctx.setAttribute(String.format("%s.error.message", prefix), String.format("Resource %s is not supported", resource)); + return QueryStatus.FAILURE; + } + + getLogger().debug("parms = "+ Arrays.toString(params.entrySet().toArray())); + + AAIRequest request = AAIRequest.createRequest(resource, nameValues); + request = new UpdateRequest(request, params); + + String[] arguments = request.getArgsList(); + for(String name : arguments) { + String modifiedKey = name.replaceAll("-", "_"); + if(nameValues.containsKey(modifiedKey)) { + String argValue = nameValues.get(modifiedKey); + if(argValue != null) argValue = argValue.trim().replace("'", "").replace("$", "").replace("'", ""); + request.addRequestProperty(name, argValue); + } + } + + 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; + } + params.put("resource-version", resourceVersion); + + request.processRequestPathValues(nameValues); + getExecutor().patch(request, resourceVersion); + } 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 { + getLogger().debug("AAIService.delete\tresource="+resource); + HashMap nameValues = keyToHashMap(key, ctx); + getLogger().debug("key = "+ Arrays.toString(nameValues.entrySet().toArray())); + + if(!checkOldFormat(resource, nameValues)) { + ctx.setAttribute(String.format("%s.error.message", "aaiData"), String.format("Resource %s is not supported. Key string contains invaid identifiers", resource)); + return QueryStatus.FAILURE; + } + + if(resource == null || resource.isEmpty() || AAIRequest.createRequest(resource, nameValues) == null) { + ctx.setAttribute(String.format("%s.error.message", "tmpDelete"), String.format("Resource %s is not supported", resource)); + return QueryStatus.FAILURE; + } + + 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 relationships = relationshipList.getRelationship(); + List iterableList = new LinkedList(relationships); + for(Relationship relationship : iterableList) { + if(relationship.getRelatedTo().equals(relatedTo)) { + relationships.remove(relationship); + itemRemoved = true; + } + } + + if(!itemRemoved) + return QueryStatus.NOT_FOUND; + +// AAIRequest masterRequest = new GenericVnfRequest(); +// masterRequest.addRequestProperty(GenericVnfRequest.VNF_ID, vnfId); +// relationshipRequest.addMasterRequest(masterRequest); +// Map attributes = objectToProperties(vnf); +// try { +// Boolean result = getExecutor().delete(relationshipRequest, attributes.get(AAIRequest.RESOURCE_VERSION)); +// } catch (AAIServiceException e) { +// return QueryStatus.FAILURE; +// } + + 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 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 params = new HashMap(); + + request.processRequestPathValues(nameValues); + if(nameValues.containsKey("prefix")){ + Map 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); + + retval = processResponseData(rv, resource, request, prefix, ctx, nameValues, modifier); + + } 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 processResponseData(String rv, String resource, AAIRequest request, String prefix, SvcLogicContext ctx, HashMap nameValues, String modifier) throws JsonParseException, JsonMappingException, IOException, AAIServiceException + { + Object response = null; + + 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 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 iRIlist = rd.getInventoryResponseItem(); + if(iRIlist == null || iRIlist.isEmpty()) { + return QueryStatus.NOT_FOUND; + } + } + + if("nodes-query".equals(resource)) { + SearchResults rd = SearchResults.class.cast(response); + List rdList = rd.getResultData(); + if(rdList == null || rdList.isEmpty()) { + return QueryStatus.NOT_FOUND; + } + ResultData rDatum = rdList.get(0); + response = rDatum; + } + + if("formatted-query".equals(resource)) { + FormattedQueryResultList rd = FormattedQueryResultList.class.cast(response); + List iRIlist = rd.getResults(); + if(iRIlist == null || iRIlist.isEmpty()) { + return QueryStatus.NOT_FOUND; + } + } + + String preFix = null; + if(prefix == null || prefix.isEmpty()) { + preFix = ""; + } else { + preFix = prefix + "."; + } + + Map props = objectToProperties(response); + Set 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()); + writeList(array, String.format("%s.%s", prefix, theKey), ctx); + } + continue; + } + + if("relationship-list".equals(theKey)){ + Map relationshipList = (Map)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(value instanceof Map) { + Map subnetsList = (Map)value; + writeMap(subnetsList, String.format("%s.%s", prefix, theKey), ctx); + continue; + } + + } + return QueryStatus.SUCCESS; + } + + + public QueryStatus newModelBackupRequest(String resource, Map params, String prefix, SvcLogicContext ctx) { + + QueryStatus retval = QueryStatus.SUCCESS; + HashMap nameValues = new HashMap(); + + 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 params, String prefix, SvcLogicContext ctx) + throws AAIServiceException { + + AAIDatum response = null; + + try { + AAIRequest request = AAIRequest.createRequest(resource, params); + if(request == null) { + return null; + } + + request.processRequestPathValues(params); + 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 parms, String prefix, SvcLogicContext ctx) { + getLogger().debug("Executing newModelSave for resource : " + resource); + HashMap nameValues = keyToHashMap(key, ctx); + + try { + ArrayList subResources = new ArrayList(); + Set set = parms.keySet(); + Map setters = new HashMap(); + Map getters = new HashMap(); + + // 1. find class + AAIRequest request = AAIRequest.createRequest(resource, nameValues); + Class resourceClass = request.getModelClass(); + getLogger().debug(resourceClass.getName()); + AAIDatum instance = resourceClass.newInstance(); + + { + Annotation[] annotations = resourceClass.getAnnotations(); + for(Annotation annotation : annotations) { + Class 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") || "boolean".equals(type.getName()) || "long".equals(type.getName())) { + 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)); + if("boolean".equals(type.getName())) { + arglist[0] = valueOf(Boolean.class, parms.get(id)); + } else if("long".equals(type.getName())) { + arglist[0] = valueOf(Long.class, parms.get(id)); + } else { + 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 if(type.getName().equals("java.util.List")) { + List newValues = new ArrayList(); + String length = id+"_length"; + if(!parms.isEmpty() && parms.containsKey(length)) { + String tmp = parms.get(length).toString(); + int count = Integer.valueOf(tmp); + for(int i=0; i relationshipKeys = new TreeSet(); + Set vlansKeys = new TreeSet(); + Set metadataKeys = new TreeSet(); + + 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 values = (ArrayList)o; +// getLogger().debug(String.format("Processing %s with parameter %s", types[0].getName(), value)); + value = value.replace("[", "").replace("]", ""); + List 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 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 relData = relationship.getRelationshipData(); +// if(relData == null) { +// relData = new LinkedList(); +// 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()); + } + + // 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 + 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.processRequestPathValues(nameValues); + request.setRequestObject(instance); + Object response = getExecutor().post(request); + if(request.expectsDataFromPUTRequest()){ + if(response != null && response instanceof String) { + String rv = response.toString(); + QueryStatus retval = processResponseData(rv, resource, request, prefix, ctx, nameValues, null); + getLogger().debug("newModelSave - returning " + retval.toString()); + return retval; + } + } + + } 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 params, String prefix, SvcLogicContext ctx) throws Exception { + + Class resourceClass = instance.getClass(); + + Set relationshipKeys = new TreeSet(); + + Set 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 relationships = relationshipList.getRelationship(); + if(relationships == null) { + relationships = new ArrayList(); + 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); + String relatedLinkKey = "relationship-list.relationship[" + i + "].related-link"; + String relatedLink = null; + if(params.containsKey(relatedLinkKey)) { + relatedLink = params.get(relatedLinkKey); + } + + Relationship relationship = new Relationship(); + relationships.add(relationship); + relationship.setRelatedTo(relatedTo); + if(relatedLink != null) { + relationship.setRelatedLink(relatedLink); + } else { + List relData = relationship.getRelationshipData(); + + 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 relationships, String relatedTo) { + if(relatedTo == null) + return null; + + for(Relationship relationship : relationships) { + if(relationship.getRelatedTo().equals(relatedTo)){ + return relationship; + } + } + return null; + } + + protected HashMap 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 results = new HashMap(); + + 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 params, SvcLogicContext ctx) throws SvcLogicException { + String resource = params.get("resource").toLowerCase(); + String prefix = params.get("data-key"); + + HashMap nameValues = new HashMap(); + 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 params, SvcLogicContext ctx) throws SvcLogicException { + + QueryStatus retval = QueryStatus.SUCCESS; + String resource = params.get("resource").toLowerCase(); + String prefix = params.get("data-key"); + + HashMap nameValues = new HashMap(); + 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; + } + + protected Map objectToProperties(Object object) { + ObjectMapper mapper = AAIService.getObjectMapper(); + return mapper.convertValue(object, Map.class); + } + + static T valueOf(Class klazz, String arg) { + Exception cause = null; + T ret = null; + try { + ret = klazz.cast(klazz.getDeclaredMethod("valueOf", String.class).invoke(null, arg)); + } catch (NoSuchMethodException exc) { + LoggerFactory.getLogger(AAIService.class).warn("Wrong data type", exc); + ret = klazz.cast(arg); + } 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 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); + if(instance == null) + return QueryStatus.NOT_FOUND; + + // 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("_", "-"); + + String relatedLink = nameValues.get("relationship.related_link"); + if(relatedLink != null) { + relatedLink = URLDecoder.decode(relatedLink, "UTF-8"); + } + + List relationships = relationshipList.getRelationship(); + List relationshipsToDelete = new LinkedList(); + + for(Relationship relationship : relationships) { + if(relatedTo.equals(relationship.getRelatedTo())) { + if(relatedLink != null) { + if(relationship.getRelatedLink() != null ) { + String localRelatedLink = relationship.getRelatedLink(); + localRelatedLink = URLDecoder.decode(localRelatedLink, "UTF-8"); + if(localRelatedLink.endsWith(relatedLink)) { + getLogger().debug(String.format("Found relationship of '%s' to keyword '%s'", relationship.getRelatedTo(), relatedTo)); + relationshipsToDelete.add(relationship); + } + } + } else { + getLogger().debug(String.format("Found relationship of '%s' to keyword '%s'", relationship.getRelatedTo(), relatedTo)); + 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 = AAIService.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; + } + } + + static final Map ctxGetBeginsWith( SvcLogicContext ctx, String prefix ) { + Map tmpPrefixMap = new HashMap(); + + 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 prefixMap = new HashMap(); + Pattern p = Pattern.compile(".*\\[\\d\\]"); + + SortedSet 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 data = new ArrayList(); + 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; + } + + /** + */ + protected NamedQueryData extractNamedQueryDataFromQueryPrefix(HashMap nameValues, Map 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 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); + + } else if("service-instance".equals(split[0])) { + ServiceInstance serviceInstance = new ServiceInstance(); + serviceInstance.setServiceInstanceId(value); + + InstanceFilter insf = new InstanceFilter(); + insf.setServiceInstance(serviceInstance); + data.getInstanceFilters().getInstanceFilter().add(insf); + + } else if("l3-network".equals(split[0])) { + L3Network l3Network = new L3Network(); + if("network-role".equals(split[1])) { + l3Network.setNetworkRole(value); + } + + InstanceFilter insf = new InstanceFilter(); + insf.setL3Network(l3Network); + data.getInstanceFilters().getInstanceFilter().add(insf); + } + } + } + } + } + + return data; + } + + public abstract T getResource(String key, Class type) throws AAIServiceException ; + protected abstract boolean deleteRelationshipList(URL url, String caller) throws AAIServiceException; +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIExecutorInterface.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIExecutorInterface.java new file mode 100644 index 00000000..5b94f258 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIExecutorInterface.java @@ -0,0 +1,30 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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; + +public interface AAIExecutorInterface { + public Object get(AAIRequest request) throws AAIServiceException; + public Object post(AAIRequest request) throws AAIServiceException; + public Boolean delete(AAIRequest request, String resourceVersion) throws AAIServiceException; + public Object query(AAIRequest request, Class clas) throws AAIServiceException; + public Boolean patch(AAIRequest request, String resourceVersion) throws AAIServiceException; +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIRequest.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIRequest.java new file mode 100644 index 00000000..f806ef4e --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIRequest.java @@ -0,0 +1,420 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Method; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.BitSet; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import java.util.TreeSet; + +import org.apache.commons.lang.StringUtils; +import org.openecomp.aai.inventory.v10.GenericVnf; +import org.openecomp.sdnc.sli.aai.data.AAIDatum; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public abstract class AAIRequest { + protected static final Logger LOG = LoggerFactory.getLogger(AAIRequest.class); + + protected static final String TARGET_URI = "org.openecomp.sdnc.sli.aai.uri"; + + protected static final String MASTER_REQUEST = "master-request"; + + public static final String RESOURCE_VERSION = "resource-version"; + + public static final String DEPTH = "depth"; + + protected static Properties configProperties; + protected final String target_uri; + protected static AAIService aaiService; + + protected AAIDatum requestDatum; + + protected final Properties requestProperties = new Properties(); + + + public static AAIRequest createRequest(String resoourceName, Map nameValues){ + + String resoource = resoourceName; + + if(resoource == null) + return null; + + if(resoource.contains(":")) { + String[] tokens = resoource.split(":"); + if(tokens != null && tokens.length > 0) { + resoource = tokens[0]; + } + } + + if(nameValues.containsKey("selflink")){ + Class clazz = null; + try { + clazz = getClassFromResource(resoource) ; + } catch (ClassNotFoundException e) { + LOG.warn("AAIRequest does not support class: " + e.getMessage()); + return null; + } + + if(clazz != null) + return new SelfLinkRequest(clazz); + else + return null; + } + + switch(resoource){ + case "generic-query": + return new GenericQueryRequest(); + case "named-query": + return new NamedQueryRequest(); + case "nodes-query": + return new NodesQueryRequest(); + case "custom-query": + return new CustomQueryRequest(); + case "linterface": + return new LInterfaceRequest(LInterfaceRequest.TYPE.L2_BRIDGE_SBG); + case "l2-bridge-sbg": + return new SubInterfaceRequest(SubInterfaceRequest.TYPE.L2_BRIDGE_SBG); + case "l2-bridge-bgf": + return new SubInterfaceRequest(SubInterfaceRequest.TYPE.L2_BRIDGE_BGF); + case "echo": + case "test": + return new EchoRequest(); + + default: + { + AAIRequest request = getRequestFromResource(resoource); + if(request == null) { + return null; + } + return request; + } + } + } + + + /** + * Map containing resource tag to its bit position in bitset mapping + */ + private static Map tagValues = new LinkedHashMap(); + /** + * Map containing bitset value of the path to its path mapping + */ + private static Map bitsetPaths = new LinkedHashMap(); + + + public static void setProperties(Properties props, AAIService aaiService) { + AAIRequest.configProperties = props; + AAIRequest.aaiService = aaiService; + + try + { + URL url = null; + Bundle bundle = FrameworkUtil.getBundle(AAIServiceActivator.class); + if(bundle != null) { + BundleContext ctx = bundle.getBundleContext(); + if(ctx == null) + return; + + url = ctx.getBundle().getResource(AAIService.PATH_PROPERTIES); + } else { + url = aaiService.getClass().getResource("/aai-path.properties"); + } + + InputStream in = url.openStream(); + Reader reader = new InputStreamReader(in, "UTF-8"); + + Properties properties = new Properties(); + properties.load(reader); + LOG.info("loaded " + properties.size()); + + Set keys = properties.stringPropertyNames(); + + int index = 0; + Set resourceNames = new TreeSet(); + + for(String key : keys) { + String[] tags = key.split("\\|"); + for(String tag : tags) { + if(!resourceNames.contains(tag)) { + resourceNames.add(tag); + tagValues.put(tag, Integer.toString(++index)); + } + } + BitSet bs = new BitSet(256); + for(String tag : tags) { + String value = tagValues.get(tag); + Integer bitIndex = Integer.parseInt(value) ; + bs.set(bitIndex); + } + String path = properties.getProperty(key); + LOG.info(String.format("bitset %s\t\t%s", bs.toString(), path)); + bitsetPaths.put(bs, path); + } + LOG.info("loaded " + resourceNames.toString()); + } + catch (Exception e) + { + LOG.error("Caught exception", e); + } + } + + public AAIRequest() { + target_uri = configProperties.getProperty(TARGET_URI); + } + + public void addRequestProperty(String key, String value) { + requestProperties.put(key, value); + } + + public final void setRequestObject(AAIDatum value) { + requestDatum = value; + } + + public final AAIDatum getRequestObject() { + return requestDatum; + } + + public final void addMasterRequest(AAIRequest masterRequest) { + requestProperties.put(MASTER_REQUEST, masterRequest); + } + + protected static String encodeQuery(String param) throws UnsupportedEncodingException { + return URLEncoder.encode(param, "UTF-8").replace("+", "%20"); + } + + protected void handleException(AAIRequest lInterfaceRequest, JsonProcessingException exc) { + aaiService.getLogger().warn("Could not deserialize object of type " + lInterfaceRequest.getClass().getSimpleName(), exc) ; + } + +// public abstract URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException; + + public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = null; + + request_url = target_uri + getRequestPath(); + + Set uniqueResources = extractUniqueResourceSetFromKeys(requestProperties.stringPropertyNames()); + +// request_url = processPathData(request_url, requestProperties); + + for(String resoourceName:uniqueResources) { + AAIRequest locRequest = AAIRequest.createRequest(resoourceName, new HashMap()); + if(locRequest != null) { + Class clazz = locRequest.getClass(); + Method function = null; + try { + function = clazz.getMethod("processPathData", request_url.getClass(), requestProperties.getClass()); + request_url = (String) function.invoke(null, request_url, requestProperties); + } catch (Exception e) { + e.printStackTrace(); + } +// request_url = locRequest.processPathData(request_url, requestProperties); + } + } + + if(resourceVersion != null) { + request_url = request_url +"?resource-version="+resourceVersion; + } + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + + + return http_req_url; + } + + + protected String getRequestPath() throws MalformedURLException { + Set uniqueResources = extractUniqueResourceSetFromKeys(requestProperties.stringPropertyNames()); + BitSet bitset = new BitSet(); + for(String key : uniqueResources) { + if(tagValues.containsKey(key)) { + Object tmpValue = tagValues.get(key); + if(tmpValue != null) { + String value = tmpValue.toString(); + int bitIndex = Integer.parseInt(value); + bitset.set(bitIndex); + } + } + } + + String path = bitsetPaths.get(bitset); + if(path == null) { + throw new MalformedURLException("PATH not found for key string containing valies :" +requestProperties.toString()); + } + return path; + } + + public abstract URL getRequestQueryUrl(String method) throws UnsupportedEncodingException, MalformedURLException; + + public abstract String toJSONString(); + + public abstract String[] getArgsList(); + + public abstract Class getModelClass() ; + + public String getPrimaryResourceName(String resource) { + return resource; + } + + public String formatKey(String argument) { + return argument; + } + + public AAIDatum jsonStringToObject(String jsonData) throws JsonParseException, JsonMappingException, IOException { + if(jsonData == null) { + return null; + } + + AAIDatum response = null; + ObjectMapper mapper = getObjectMapper(); + response = mapper.readValue(jsonData, getModelClass()); + return response; + } + + protected static Set extractUniqueResourceSetFromKeys(Set keySet) { + Set uniqueResources = new TreeSet(); + List keys = new ArrayList(keySet); + for(String resource : keys) { + if(resource.contains(".")) { + String [] split = resource.split("\\."); + uniqueResources.add(split[0].replaceAll("_", "-")); + } + } + return uniqueResources; + } + + public void processRequestPathValues(Map nameValues) { + Set uniqueResources = extractUniqueResourceSetFromKeys(nameValues.keySet()); + + Set tokens = new TreeSet(); + tokens.add(DEPTH); + tokens.addAll(Arrays.asList(this.getArgsList())); + + for(String resoourceName:uniqueResources) { + AAIRequest locRequest = AAIRequest.createRequest(resoourceName, nameValues); + if(locRequest != null) + tokens.addAll(Arrays.asList(locRequest.getArgsList())); + } + + String[] arguments = tokens.toArray(new String[0]); + for(String name : arguments) { + String tmpName = name.replaceAll("-", "_"); + String value = nameValues.get(tmpName); + if(value != null && !value.isEmpty()) { + value = value.trim().replace("'", "").replace("$", "").replace("'", ""); + this.addRequestProperty(name, value); + } + } + } + + public static String processPathData(String request_url, Properties requestProperties) throws UnsupportedEncodingException { + return request_url; + } + + public boolean isDeleteDataRequired() { + return false; + } + + ObjectMapper getObjectMapper() { + return AAIService.getObjectMapper(); + } + + protected static Class getClassFromResource(String resoourceName) throws ClassNotFoundException { + String className = GenericVnf.class.getName(); + String[] split = resoourceName.split("-"); + for(int i = 0; i < split.length; i++) { + split[i] = StringUtils.capitalize(split[i]); + } + + String caps = StringUtils.join(split); + className = className.replace("GenericVnf", caps); + Class clazz = null; + try { + clazz = (Class)Class.forName(className); + } catch (ClassNotFoundException e) { + LOG.warn("AAIRequest does not support class: " + e.getMessage()); + return null; + } + + return clazz; + } + + protected static AAIRequest getRequestFromResource(String resoourceName) { + + Class clazz = null; + try { + clazz = getClassFromResource(resoourceName); + } catch (ClassNotFoundException e) { + LOG.warn("AAIRequest does not support class: " + e.getMessage()); + return null; + } + if(clazz == null) { + return null; + } + GenericRequest request = new GenericRequest(clazz); + return request; + } + + public static Map splitQuery(String query) throws UnsupportedEncodingException { + Map query_pairs = new LinkedHashMap(); + + if(query != null && !query.isEmpty()) { + String[] pairs = query.split("&"); + for (String pair : pairs) { + int idx = pair.indexOf("="); + query_pairs.put(URLDecoder.decode(pair.substring(0, idx), "UTF-8"), URLDecoder.decode(pair.substring(idx + 1), "UTF-8")); + } + } + return query_pairs; + } + + protected boolean expectsDataFromPUTRequest() { + return false; + } +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIService.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIService.java new file mode 100644 index 00000000..3f62374a --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIService.java @@ -0,0 +1,3278 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.NoSuchAlgorithmException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Properties; +import java.util.Set; +import java.util.TimeZone; +import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.SSLSocketFactory; +import javax.ws.rs.HttpMethod; +import javax.xml.bind.annotation.XmlElement; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang3.StringUtils; +import org.onap.ccsdk.sli.core.sli.ConfigurationException; +import org.onap.ccsdk.sli.core.sli.MetricLogger; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource; +import org.openecomp.aai.inventory.v10.AvailabilityZone; +import org.openecomp.aai.inventory.v10.Complex; +import org.openecomp.aai.inventory.v10.CtagPool; +import org.openecomp.aai.inventory.v10.DvsSwitch; +import org.openecomp.aai.inventory.v10.GenericVnf; +import org.openecomp.aai.inventory.v10.L3Network; +import org.openecomp.aai.inventory.v10.OamNetwork; +import org.openecomp.aai.inventory.v10.PInterface; +import org.openecomp.aai.inventory.v10.PhysicalLink; +import org.openecomp.aai.inventory.v10.Pserver; +import org.openecomp.aai.inventory.v10.ResultData; +import org.openecomp.aai.inventory.v10.SearchResults; +import org.openecomp.aai.inventory.v10.Service; +import org.openecomp.aai.inventory.v10.ServiceInstance; +import org.openecomp.aai.inventory.v10.SitePairSet; +import org.openecomp.aai.inventory.v10.Tenant; +import org.openecomp.aai.inventory.v10.Vce; +import org.openecomp.aai.inventory.v10.VnfImage; +import org.openecomp.aai.inventory.v10.VnfImages; +import org.openecomp.aai.inventory.v10.Vpe; +import org.openecomp.aai.inventory.v10.VplsPe; +import org.openecomp.aai.inventory.v10.VpnBinding; +import org.openecomp.aai.inventory.v10.Vserver; +import org.openecomp.sdnc.sli.aai.data.AAIDatum; +import org.openecomp.sdnc.sli.aai.data.ErrorResponse; +import org.openecomp.sdnc.sli.aai.data.RequestError; +import org.openecomp.sdnc.sli.aai.data.ResourceVersion; +import org.openecomp.sdnc.sli.aai.data.ServiceException; +import org.openecomp.sdnc.sli.aai.data.notify.NotifyEvent; +import org.openecomp.sdnc.sli.aai.data.v1507.VServer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.AnnotationIntrospector; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; +import com.fasterxml.jackson.databind.type.TypeFactory; +import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector; +import com.sun.jersey.api.client.config.DefaultClientConfig; +import com.sun.jersey.client.urlconnection.HTTPSProperties; + + +public class AAIService extends AAIDeclarations implements AAIClient, SvcLogicResource { + + public static final String AAICLIENT_PROPERTIES = "/aaiclient.properties"; + public static final String PATH_PROPERTIES = "/aai-path.properties"; + + private static final Logger LOG = LoggerFactory.getLogger(AAIService.class); + + private final String truststore_path; + private final String truststore_password; + private final String keystore_path; + private final String keystore_password; + private final Boolean ignore_certificate_host_error; + + private final String target_uri; + private final String query_path; // = "sdn-zone-query"; + + private final String network_vserver_path; + + private final String svc_instance_path; + private final String svc_inst_qry_path; + + private final String vnf_image_query_path; + + private final String param_service_type; //= "service-type"; + + private final String ubb_notify_path; + private final String selflink_avpn; + private final String selflink_fqdn; + + private final String p_interface_path; + + private final String service_path; + private final String site_pair_set_path; + + private final int connection_timeout; + private final int read_timeout; + + // 1602 + private final String query_nodes_path; + private final String update_path; + + private final String application_id; + + // authentication credentials + private String user_name; + private String user_password; + + // runtime + private final boolean runtimeOSGI; + + private SSLContext CTX; + + private final MetricLogger ml = new MetricLogger(); + + private final AAIRequestExecutor executor; + + public AAIService(URL propURL) { + LOG.info("Entered AAIService.ctor"); + + String runtime = System.getProperty("aaiclient.runtime"); + if(runtime != null && runtime.equals("OSGI")) { + runtimeOSGI = true; + } else { + runtimeOSGI = false; + } + + Properties props = null; + try { + props = initialize(propURL); + AAIRequest.setProperties(props, this); + + } catch(Exception exc){ + LOG.error("AicAAIResource.static", exc); + } + + executor = new AAIRequestExecutor(); + + user_name = props.getProperty(CLIENT_NAME); + user_password = props.getProperty(CLIENT_PWWD); + + if(user_name == null || user_name.isEmpty()){ + LOG.debug("Basic user name is not set"); + } + if(user_password == null || user_password.isEmpty()) { + LOG.debug("Basic password is not set"); + } + + truststore_path = props.getProperty(TRUSTSTORE_PATH); + truststore_password = props.getProperty(TRUSTSTORE_PSSWD); + keystore_path = props.getProperty(KEYSTORE_PATH); + keystore_password = props.getProperty(KEYSTORE_PSSWD); + + target_uri = props.getProperty(TARGET_URI); + query_path = props.getProperty(QUERY_PATH); + update_path = props.getProperty(UPDATE_PATH); + + String applicationId =props.getProperty(APPLICATION_ID); + if(applicationId == null || applicationId.isEmpty()) { + applicationId = "SDNC"; + } + application_id = applicationId; + + // connection timeout + int tmpConnectionTimeout = 30000; + int tmpReadTimeout = 30000; + + try { + String tmpValue = null; + tmpValue = props.getProperty(CONNECTION_TIMEOUT, "30000"); + tmpConnectionTimeout = Integer.parseInt(tmpValue); + tmpValue = props.getProperty(READ_TIMEOUT, "30000"); + tmpReadTimeout = Integer.parseInt(tmpValue); + } catch(Exception exc) { + LOG.error("Failed setting connection timeout", exc); + tmpConnectionTimeout = 30000; + tmpReadTimeout = 30000; + } + connection_timeout = tmpConnectionTimeout; + read_timeout = tmpReadTimeout; + + network_vserver_path =props.getProperty(NETWORK_VSERVER_PATH); + + svc_instance_path = props.getProperty(SVC_INSTANCE_PATH); // "/aai/v1/business/customers/customer/{customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances"); +// "/aai/v1/business/customers/customer/ma9181-203-customerid/service-subscriptions/service-subscription/ma9181%20Hosted%20Voice/service-instances"; + +// svc_inst_qry_path = props.getProperty(SVC_INST_QRY_PATH, "/aai/v1/search/generic-query?key=service-instance.service-instance-id:ma9181-204-instance&start-node-type=service-instance&include=service-instance"); + svc_inst_qry_path = props.getProperty(SVC_INST_QRY_PATH); // "/aai/v1/search/generic-query?key=service-instance.service-instance-id:{svc-instance-id}&start-node-type=service-instance&include=service-instance"); + + + param_service_type = props.getProperty(PARAM_SERVICE_TYPE, "service-type"); + + // P-Interfaces + p_interface_path = props.getProperty(P_INTERFACE_PATH); + + vnf_image_query_path = props.getProperty(VNF_IMAGE_QUERY_PATH); + + ubb_notify_path = props.getProperty(UBB_NOTIFY_PATH); + selflink_avpn = props.getProperty(SELFLINK_AVPN); + selflink_fqdn = props.getProperty(SELFLINK_FQDN); + + service_path = props.getProperty(SERVICE_PATH); + + site_pair_set_path = props.getProperty(SITE_PAIR_SET_PATH); + + query_nodes_path = props.getProperty(QUERY_NODES_PATH); + + String iche = props.getProperty(CERTIFICATE_HOST_ERROR); + boolean host_error = false; + if(iche != null && !iche.isEmpty()) { + host_error = Boolean.valueOf(iche); + } + + ignore_certificate_host_error = host_error; + + HttpsURLConnection.setDefaultHostnameVerifier( new HostnameVerifier(){ + public boolean verify(String string,SSLSession ssls) { + return ignore_certificate_host_error; + } + }); + + if(truststore_path != null && truststore_password != null && (new File(truststore_path)).exists()) { + System.setProperty("javax.net.ssl.trustStore", truststore_path); + System.setProperty("javax.net.ssl.trustStorePassword", truststore_password); + } + + if(keystore_path != null && keystore_password != null && (new File(keystore_path)).exists()) + { + DefaultClientConfig config = new DefaultClientConfig(); + //both jersey and HttpURLConnection can use this + SSLContext ctx = null; + try { + ctx = SSLContext.getInstance("TLS"); + + KeyManagerFactory kmf = null; + try { + String def = "SunX509"; + String storeType = "PKCS12"; + def = KeyStore.getDefaultType(); + kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + FileInputStream fin = new FileInputStream(keystore_path); +// KeyStore ks = KeyStore.getInstance("PKCS12"); + + String extension = keystore_path.substring(keystore_path.lastIndexOf(".") + 1); + + if(extension != null && !extension.isEmpty() && extension.equalsIgnoreCase("JKS")) { + storeType = "JKS"; + } + KeyStore ks = KeyStore.getInstance(storeType); + + char[] pwd = keystore_password.toCharArray(); + ks.load(fin, pwd); + kmf.init(ks, pwd); + } catch (Exception ex) { + LOG.error("AAIResource", ex); + } + + ctx.init(kmf.getKeyManagers(), null, null); + config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, new HTTPSProperties( new HostnameVerifier() { + @Override + public boolean verify( String s, SSLSession sslSession ) { + return ignore_certificate_host_error; + } + }, ctx)); + + CTX = ctx; + LOG.debug("SSLContext created"); + + } catch (KeyManagementException | NoSuchAlgorithmException exc) { + LOG.error("AAIResource", exc); + } + } + + LOG.info("AAIResource.ctor initialized."); + + try { + Field methodsField = HttpURLConnection.class.getDeclaredField("methods"); + methodsField.setAccessible(true); + // get the methods field modifiers + Field modifiersField = Field.class.getDeclaredField("modifiers"); + // bypass the "private" modifier + modifiersField.setAccessible(true); + + // remove the "final" modifier + modifiersField.setInt(methodsField, methodsField.getModifiers() & ~Modifier.FINAL); + + /* valid HTTP methods */ + String[] methods = { + "GET", "POST", "HEAD", "OPTIONS", "PUT", "DELETE", "TRACE", "PATCH" + }; + // set the new methods - including patch + methodsField.set(null, methods); + + } catch (SecurityException | IllegalArgumentException | IllegalAccessException | NoSuchFieldException e) { + e.printStackTrace(); + } + + } + + public void cleanUp() { + + } + + /** + * + * @param http_req_url + * @param method + * @return + * @throws Exception + */ + protected HttpURLConnection getConfiguredConnection(URL http_req_url, String method) throws Exception { + HttpURLConnection con = (HttpURLConnection) http_req_url.openConnection(); + + // Set up the connection properties + con.setRequestProperty( "Connection", "close" ); + con.setDoInput(true); + con.setDoOutput(true); + con.setUseCaches(false); + con.setConnectTimeout( connection_timeout ); + con.setReadTimeout( read_timeout ); + con.setRequestMethod( method ); + con.setRequestProperty( "Accept", "application/json" ); + con.setRequestProperty( "Content-Type", "PATCH".equalsIgnoreCase(method) ? "application/merge-patch+json" : "application/json" ); + con.setRequestProperty("X-FromAppId", application_id); + con.setRequestProperty("X-TransactionId",TransactionIdTracker.getNextTransactionId()); + con.setRequestProperty(MetricLogger.REQUEST_ID, ml.getRequestID()); + + if(user_name != null && !user_name.isEmpty() && user_password != null && !user_password.isEmpty()) { + String basicAuth = "Basic " + new String(Base64.encodeBase64((user_name + ":" + user_password).getBytes())); + con.setRequestProperty ("Authorization", basicAuth); + } + + if(con instanceof HttpsURLConnection && CTX != null) { + SSLSocketFactory sockFact = CTX.getSocketFactory(); + HttpsURLConnection.class.cast(con).setSSLSocketFactory( sockFact ); + } + return con; + } + + + @Override + public GenericVnf requestGenericVnfData(String vnf_id) throws AAIServiceException { + GenericVnf response = null; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("generic-vnf"); + request.addRequestProperty("generic-vnf.vnf-id", vnf_id); + String rv = executor.get(request); + if(rv != null) { + ObjectMapper mapper = getObjectMapper(); + response = mapper.readValue(rv, GenericVnf.class); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn(new Object(){}.getClass().getEnclosingMethod().getName(), exc); + throw new AAIServiceException(exc); + } + + return response; + + } + + @Override + public boolean postGenericVnfData(String vnf_id, GenericVnf data) throws AAIServiceException { + try { + AAIRequest request = AAIRequest.getRequestFromResource("generic-vnf"); + request.addRequestProperty("generic-vnf.vnf-id", vnf_id); + request.setRequestObject(data); + Object response = executor.post(request); + return true; + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("requestGenericVnfData", exc); + throw new AAIServiceException(exc); + } + } + + @Override + public boolean deleteGenericVnfData(String vnf_id, String resourceVersion) throws AAIServiceException { + boolean response = false; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("generic-vnf"); + request.addRequestProperty("generic-vnf.vnf-id", vnf_id); + response = executor.delete(request, resourceVersion); + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("deleteGenericVnfData", exc); + throw new AAIServiceException(exc); + } + return response; + } + + /* (non-Javadoc) + * @see org.openecomp.sdnc.sli.resource.aic.AnAIClient#requestSdnZoneQuery(java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public Vce requestNetworkVceData(String vnf_id) throws AAIServiceException { + Vce response = null; + try { + AAIRequest request = AAIRequest.getRequestFromResource("vce"); + request.addRequestProperty("vce.vnf-id", vnf_id); + String rv = executor.get(request); + if(rv != null) { + ObjectMapper mapper = getObjectMapper(); + response = mapper.readValue(rv, Vce.class); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn(new Object(){}.getClass().getEnclosingMethod().getName(), exc); + throw new AAIServiceException(exc); + } + + return response; + } + + + /* (non-Javadoc) + * @see org.openecomp.sdnc.sli.resource.aic.AnAIClient#requestSdnZoneQuery(java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public boolean deleteNetworkVceData(String vnf_id, String resourceVersion) throws AAIServiceException { + boolean response = false; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("vce"); + request.addRequestProperty("vce.vnf-id", vnf_id); + response = executor.delete(request, resourceVersion); + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("deleteNetworkVceData", exc); + throw new AAIServiceException(exc); + } + return response; + } + + /* (non-Javadoc) + * @see org.openecomp.sdnc.sli.resource.aic.AnAIClient#postNetworkVceData(java.lang.String, org.openecomp.sdnc.sli.resource.aic.aai.VCERequest) + */ + @Override + public boolean postNetworkVceData(String vnf_id, Vce data) throws AAIServiceException { + try { + AAIRequest request = AAIRequest.getRequestFromResource("vce"); + request.addRequestProperty("vce.vnf-id", vnf_id); + request.setRequestObject(data); + Object response = executor.post(request); + return true; + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("requestGenericVnfData", exc); + throw new AAIServiceException(exc); + } + } + + + @Override + public SearchResults requestServiceInstanceURL(String svc_instance_id) throws AAIServiceException { + SearchResults response = null; + InputStream inputStream = null; + + try { + String path = svc_inst_qry_path; + path = path.replace("{svc-instance-id}", encodeQuery(svc_instance_id)); + + String request_url = target_uri+path; + URL http_req_url = new URL(request_url); + + HttpURLConnection con = getConfiguredConnection(http_req_url, HttpMethod.GET); + + LOGwriteFirstTrace(HttpMethod.GET, http_req_url.toString()); + LOGwriteDateTrace("svc_instance_id", svc_instance_id); + + // Check for errors + int responseCode = con.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + inputStream = con.getInputStream(); + } else { + inputStream = con.getErrorStream(); + } + + // Process the response + LOG.debug("HttpURLConnection result:" + responseCode); + if(inputStream == null) inputStream = new ByteArrayInputStream("".getBytes(StandardCharsets.UTF_8)); + BufferedReader reader = new BufferedReader( new InputStreamReader( inputStream ) ); + + ObjectMapper mapper = getObjectMapper(); + + if (responseCode == HttpURLConnection.HTTP_OK) { +// StringBuilder stringBuilder = new StringBuilder("\n"); +// String line = null; +// while( ( line = reader.readLine() ) != null ) { +// stringBuilder.append("\n").append( line ); +// } +// LOG.info(stringBuilder.toString()); + response = mapper.readValue(reader, SearchResults.class); + LOGwriteEndingTrace(HttpURLConnection.HTTP_OK, "SUCCESS", mapper.writeValueAsString(response)); + } else if(responseCode == HttpURLConnection.HTTP_NOT_FOUND ) { + LOGwriteEndingTrace(responseCode, "HTTP_NOT_FOUND", "Entry does not exist."); + return response; + } else { + ErrorResponse errorresponse = mapper.readValue(reader, ErrorResponse.class); + LOGwriteEndingTrace(responseCode, "FAILURE", mapper.writeValueAsString(errorresponse)); + throw new AAIServiceException(responseCode, errorresponse); + } + + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("requestServiceInstanceURL", exc); + throw new AAIServiceException(exc); + } finally { + if(inputStream != null){ + try { + inputStream.close(); + } catch(Exception exc) { + + } + } + } + return response; + } + + @Override + public ServiceInstance requestServiceInterfaceData(String customer_id, String service_type, String svc_instance_id) throws AAIServiceException { + ServiceInstance response = null; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("service-instance"); + request.addRequestProperty("customer.global-customer-id", customer_id); + request.addRequestProperty("ervice-subscription.service-type", service_type); + request.addRequestProperty("service-instance.service-instance-id", svc_instance_id); + + String rv = executor.get(request); + if(rv != null) { + ObjectMapper mapper = getObjectMapper(); + response = mapper.readValue(rv, ServiceInstance.class); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("requestServiceInterfaceData", exc); + throw new AAIServiceException(exc); + } + return response; + } + + @Override + public boolean postServiceInterfaceData(String customer_id, String service_type, String svc_instance_id, ServiceInstance data) throws AAIServiceException { + try { + AAIRequest request = AAIRequest.getRequestFromResource("service-instance"); + request.addRequestProperty("customer.customer-id", customer_id); + request.addRequestProperty("service-subscription.service-type", service_type); + request.addRequestProperty("service-instance.service-instance-id", svc_instance_id); + request.setRequestObject(data); + Object response = executor.post(request); + return true; + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("requestGenericVnfData", exc); + throw new AAIServiceException(exc); + } + } + + + private static Properties initialize(URL url ) throws ConfigurationException { + + if(url == null) { + throw new NullPointerException(); + } + + InputStream is = null; + Properties props = new Properties(); + + try { + if(LOG.isDebugEnabled()) + LOG.info("Property file is: " + url.toString()); + + is = url.openStream(); + + props.load(is); + if(LOG.isDebugEnabled()) { + LOG.info("Properties loaded: " + props.size()); + Enumeration en = props.keys(); + + while(en.hasMoreElements()) { + String key = (String)en.nextElement(); + String property = props.getProperty(key); + LOG.debug(key + " : " + property); + } + } + } catch (Exception e) { + throw new ConfigurationException("Could not load properties file.", e); + } + return props; + } + + static class TransactionIdTracker { +// protected static AtomicLong tracker = new AtomicLong(); + + public static String getNextTransactionId() { +// long id = tracker.getAndIncrement(); +// String transactionId = String.format("N%016X", id); + String transactionId = UUID.randomUUID().toString(); + return transactionId; + } + + } + + protected void LOGwriteFirstTrace(String method, String url) { + String time = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(System.currentTimeMillis()); + LOG.info("A&AI transaction :"); + LOG.info("Request Time : " + time + ", Method : " + method); + LOG.info("Request URL : "+ url); + } + + protected void LOGwriteDateTrace(String name, String data) { + LOG.info("Input - " + name + " : " + data); + } + + protected void LOGwriteEndingTrace(int response_code, String comment, String data) { + LOG.info("Response code : " + response_code +", " + comment); + LOG.info(String.format("Response data : %s", data)); + } + + protected String encodeQuery(String param) throws UnsupportedEncodingException { + return URLEncoder.encode(param, "UTF-8").replace("+", "%20"); + } + + private String encodeCustomerURL(final String selection) + { + String encrypted_url = selection; + String apnpattern = + "/aai/v10/business/customers/customer/(.+)/service-subscriptions/service-subscription/(.+)/service-instances/service-instance/(.+)/"; + Pattern pattern = Pattern.compile(apnpattern); + + try { + URL url = new URL(selection); + String path = url.getPath(); + + LOG.info("Trying to match apn to <" + path + ">"); + + Matcher matcher = pattern.matcher(path); + + while(matcher.find()) { + String customer = matcher.group(1); + String subscription = matcher.group(2); + String service = matcher.group(3); + + encrypted_url = selection.replace(customer, encodeQuery(customer)); + encrypted_url = encrypted_url.replace(subscription, encodeQuery(subscription)); + encrypted_url = encrypted_url.replace(service, encodeQuery(service)); + } + } catch (Exception e) { + LOG.warn("", e); + } + + return encrypted_url; + } + + @Override + public Vpe requestNetworkVpeData(String vnf_id) throws AAIServiceException { + Vpe response = null; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("vpe"); + request.addRequestProperty("vpe.vnf-id", vnf_id); + String rv = executor.get(request); + if(rv != null) { + ObjectMapper mapper = getObjectMapper(); + response = mapper.readValue(rv, Vpe.class); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn(new Object(){}.getClass().getEnclosingMethod().getName(), exc); + throw new AAIServiceException(exc); + } + return response; + } + + @Override + public boolean postNetworkVpeData(String vnf_id, Vpe data) throws AAIServiceException { + try { + AAIRequest request = AAIRequest.getRequestFromResource("vpe"); + request.addRequestProperty("vpe.vnf-id", vnf_id); + request.setRequestObject(data); + Object response = executor.post(request); + return true; + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn(new Object(){}.getClass().getEnclosingMethod().getName(), exc); + throw new AAIServiceException(exc); + } + } + + @Override + public boolean deleteNetworkVpeData(String vnf_id, String resourceVersion) throws AAIServiceException { + boolean response = false; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("vpe"); + request.addRequestProperty("vpe.vnf-id", vnf_id); + response = executor.delete(request, resourceVersion); + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn(new Object(){}.getClass().getEnclosingMethod().getName(), exc); + throw new AAIServiceException(exc); + } + return response; + } + + @Override + public VplsPe requestNetworkVplsPeData(String equipment_name)throws AAIServiceException { + VplsPe response = null; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("vpls-pe"); + request.addRequestProperty("vpls-pe.equipment-name", equipment_name); + + String rv = executor.get(request); + if(rv != null) { + ObjectMapper mapper = getObjectMapper(); + response = mapper.readValue(rv, VplsPe.class); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn(new Object(){}.getClass().getEnclosingMethod().getName(), exc); + throw new AAIServiceException(exc); + } + return response; + } + + @Override + public boolean postNetworkVplsPeData(String equipment_name, VplsPe data) throws AAIServiceException { + try { + AAIRequest request = AAIRequest.getRequestFromResource("vpls-pe"); + request.addRequestProperty("vpls-pe.equipment-name", equipment_name); + request.setRequestObject(data); + Object response = executor.post(request); + return true; + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("requestGenericVnfData", exc); + throw new AAIServiceException(exc); + } + } + + @Override + public boolean deleteNetworkVplsPeData(String vnf_id, String resourceVersion) throws AAIServiceException { + boolean response = false; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("vpls-pe"); + request.addRequestProperty("vpls-pe.equipment-name", vnf_id); + response = executor.delete(request, resourceVersion); + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("deleteNetworkVplsPeData", exc); + throw new AAIServiceException(exc); + } + return response; + } + + @Override + public Complex requestNetworkComplexData(String pLocId) throws AAIServiceException { + Complex response = null; + InputStream inputStream = null; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("complex"); + request.addRequestProperty("complex.physical-location-id", pLocId); + + String rv = executor.get(request); + if(rv != null) { + ObjectMapper mapper = getObjectMapper(); + response = mapper.readValue(rv, Complex.class); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("requestNetworkComplexData", exc); + throw new AAIServiceException(exc); + } finally { + if(inputStream != null){ + try { + inputStream.close(); + } catch(Exception exc) { + + } + } + } + return response; + } + + @Override + public boolean postNetworkComplexData(String vnf_id, Complex data) throws AAIServiceException { + try { + AAIRequest request = AAIRequest.getRequestFromResource("complex"); + request.addRequestProperty("complex.physical-location-id", vnf_id); + request.setRequestObject(data); + Object response = executor.post(request); + return true; + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("postNetworkComplexData", exc); + throw new AAIServiceException(exc); + } + } + + @Override + public boolean deleteNetworkComplexData(String pLocId, String resourceVersion) throws AAIServiceException { + boolean response = false; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("complex"); + request.addRequestProperty("complex.physical-location-id", pLocId); + + response = executor.delete(request, resourceVersion); + + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("deleteNetworkComplexData", exc); + throw new AAIServiceException(exc); + } + return response; + } + + /* + * (non-Javadoc) + * @see org.openecomp.sdnct.sli.aai.AAIClient#requestVServersData(java.lang.String, java.lang.String) + */ + @Override + public Vserver requestVServerData(String tenantId, String vserverId, String cloudOwner, String cloudRegionId) throws AAIServiceException { + Vserver response = null; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("vserver"); + request.addRequestProperty("cloud-region.cloud-owner", cloudOwner); + request.addRequestProperty("cloud-region.cloud-region-id", cloudRegionId); + request.addRequestProperty("tenant.tenant-id", tenantId); + request.addRequestProperty("vserver.vserver-id", vserverId); + + String rv = executor.get(request); + if(rv != null) { + ObjectMapper mapper = getObjectMapper(); + response = mapper.readValue(rv, Vserver.class); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn(new Object(){}.getClass().getEnclosingMethod().getName(), exc); + throw new AAIServiceException(exc); + } + return response; + } + + + @Override + public boolean postVServerData(String tenantId, String vserverId, String cloudOwner, String cloudRegionId, Vserver data) throws AAIServiceException { + try { + AAIRequest request = AAIRequest.getRequestFromResource("vserver"); + request.addRequestProperty("cloud-region.cloud-owner", cloudOwner); + request.addRequestProperty("cloud-region.cloud-region-id", cloudRegionId); + request.addRequestProperty("tenant.tenant-id", tenantId); + request.addRequestProperty("vserver.vserver-id", vserverId); + request.setRequestObject(data); + Object response = executor.post(request); + return true; + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("postNetworkComplexData", exc); + throw new AAIServiceException(exc); + } + } + + @Override + public boolean deleteVServerData(String tenant_id, String vserver_id, String cloudOwner, String cloudRegionId, String resourceVersion) throws AAIServiceException { + boolean response = false; + InputStream inputStream = null; + + try { + String local_network_complexes_path = network_vserver_path.replace("{tenant-id}", encodeQuery(tenant_id)); + local_network_complexes_path = local_network_complexes_path.replace("{vserver-id}", encodeQuery(vserver_id)); + local_network_complexes_path = local_network_complexes_path.replace("{cloud-owner}", encodeQuery(cloudOwner)); + local_network_complexes_path = local_network_complexes_path.replace("{cloud-region-id}", encodeQuery(cloudRegionId)); + + String request_url = target_uri+local_network_complexes_path; + if(resourceVersion!=null) { + request_url = request_url +"?resource-version="+resourceVersion; + } + URL http_req_url = new URL(request_url); + + HttpURLConnection con = getConfiguredConnection(http_req_url, HttpMethod.DELETE); + + LOGwriteFirstTrace(HttpMethod.DELETE, http_req_url.toString()); + LOGwriteDateTrace("tenant_id", tenant_id); + LOGwriteDateTrace("vserver_id", vserver_id); + LOGwriteDateTrace("cloud-owner", cloudOwner); + LOGwriteDateTrace("cloud-region-id", cloudRegionId); + + // Check for errors + int responseCode = con.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_NO_CONTENT) { + inputStream = con.getInputStream(); + } else { + inputStream = con.getErrorStream(); + } + + // Process the response + LOG.debug("HttpURLConnection result:" + responseCode); + if(inputStream == null) inputStream = new ByteArrayInputStream("".getBytes(StandardCharsets.UTF_8)); + BufferedReader reader = new BufferedReader( new InputStreamReader( inputStream ) ); + String line = null; + + ObjectMapper mapper = getObjectMapper(); + + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_NO_CONTENT) { + StringBuilder stringBuilder = new StringBuilder(); + + while( ( line = reader.readLine() ) != null ) { + stringBuilder.append( line ); + } + LOGwriteEndingTrace(responseCode, "SUCCESS", stringBuilder.toString()); + response = true; + } else if(responseCode == HttpURLConnection.HTTP_NOT_FOUND ) { + LOGwriteEndingTrace(responseCode, "HTTP_NOT_FOUND", "Entry does not exist."); + response = false; + } else { + ErrorResponse errorresponse = mapper.readValue(reader, ErrorResponse.class); + LOGwriteEndingTrace(responseCode, "FAILURE", mapper.writeValueAsString(errorresponse)); + throw new AAIServiceException(responseCode, errorresponse); + } + + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("deleteVServerData", exc); + throw new AAIServiceException(exc); + } finally { + if(inputStream != null){ + try { + inputStream.close(); + } catch(Exception exc) { + + } + } + } + return response; + } + + + /* + * (non-Javadoc) + * @see org.openecomp.sdnc.sli.aai.AAIClient#requestCtagPoolData(String) + */ + @Override + public CtagPool requestCtagPoolData(String physical_location_id, String target_pe, String availability_zone_name) throws AAIServiceException { + CtagPool response = null; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("ctag-pool"); + + request.addRequestProperty("ctag-pool.target-pe", target_pe); + request.addRequestProperty("ctag-pool.availability-zone-name", availability_zone_name); + request.addRequestProperty("complex.physical-location-id", physical_location_id); + + String rv = executor.get(request); + if(rv != null) { + ObjectMapper mapper = getObjectMapper(); + response = mapper.readValue(rv, CtagPool.class); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("requestNetworkVceData", exc); + throw new AAIServiceException(exc); + } + return response; + } + + //==================== DvsSwitch ====================== + @Override + public DvsSwitch requestDvsSwitchData(String vnf_id) throws AAIServiceException { + DvsSwitch response = null; + InputStream inputStream = null; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("dvs-switch"); + request.addRequestProperty("dvs-switch.switch-name", vnf_id); + + String rv = executor.get(request); + if(rv != null) { + ObjectMapper mapper = getObjectMapper(); + response = mapper.readValue(rv, DvsSwitch.class); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("requestDvsSwitchData", exc); + throw new AAIServiceException(exc); + } finally { + if(inputStream != null){ + try { + inputStream.close(); + } catch(Exception exc) { + + } + } + } + return response; + } + + @Override + public boolean postDvsSwitchData(String switch_name, DvsSwitch data) throws AAIServiceException { + try { + AAIRequest request = AAIRequest.getRequestFromResource("dvs-switch"); + request.addRequestProperty("dvs-switch.switch-name", switch_name); + request.setRequestObject(data); + Object response = executor.post(request); + return true; + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn(new Object(){}.getClass().getEnclosingMethod().getName(), exc); + throw new AAIServiceException(exc); + } + } + + @Override + public boolean deleteDvsSwitchData(String vnf_id, String resourceVersion) throws AAIServiceException { + boolean response = false; + InputStream inputStream = null; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("dvs-switch"); + request.addRequestProperty("dvs-switch.switch-name", vnf_id); + response = executor.delete(request, resourceVersion); + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("deleteDvsSwitchData", exc); + throw new AAIServiceException(exc); + } + return response; + } + //================== End of DvsSwitch ================= + //==================== PhysicalLink ====================== + @Override + public PhysicalLink requestPhysicalLinkData(String linkName) throws AAIServiceException { + PhysicalLink response = null; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("physical-link"); + request.addRequestProperty("physical-link.link-name", linkName); + + String rv = executor.get(request); + if(rv != null) { + ObjectMapper mapper = getObjectMapper(); + response = mapper.readValue(rv, PhysicalLink.class); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("requestPhysicalLinkData", exc); + throw new AAIServiceException(exc); + } + return response; + } + + @Override + public boolean postPhysicalLinkData(String linkName, PhysicalLink data) throws AAIServiceException { + try { + AAIRequest request = AAIRequest.getRequestFromResource("physical-link"); + request.addRequestProperty("physical-link.link-name", linkName); + request.setRequestObject(data); + Object response = executor.post(request); + return true; + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn(new Object(){}.getClass().getEnclosingMethod().getName(), exc); + throw new AAIServiceException(exc); + } + } + + @Override + public boolean deletePhysicalLinkData(String linkName, String resourceVersion) throws AAIServiceException { + boolean response = false; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("physical-link"); + request.addRequestProperty("physical-link.link-name", linkName); + response = executor.delete(request, resourceVersion); + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("deletePhysicalLinkData", exc); + throw new AAIServiceException(exc); + } + return response; + } + //================== End of PhysicalLink ================= + //==================== PInterface ====================== + @Override + public PInterface requestPInterfaceData(String hostname, String interfaceName) throws AAIServiceException { + PInterface response = null; + + try { + AAIRequest request = new PInterfaceRequest(); + request.addRequestProperty(PInterfaceRequest.PINTERFACE_INTERFACE_NAME, interfaceName); + request.addRequestProperty(PInterfaceRequest.PSERVER_HOSTNAME, hostname); + String rv = executor.get(request); + if(rv != null) { + ObjectMapper mapper = getObjectMapper(); + response = mapper.readValue(rv, PInterface.class); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn(new Object(){}.getClass().getEnclosingMethod().getName(), exc); + throw new AAIServiceException(exc); + } + return response; + } + + @Override + public boolean postPInterfaceData(String hostname, String interfaceName, PInterface request) throws AAIServiceException { + InputStream inputStream = null; + + try { + + ObjectMapper mapper = getObjectMapper(); + String json_text = mapper.writeValueAsString(request); + + SSLSocketFactory sockFact = CTX.getSocketFactory(); + + String request_url = target_uri+p_interface_path; + String encoded_vnf = encodeQuery(hostname); + request_url = request_url.replace("{hostname}", encoded_vnf) ; + encoded_vnf = encodeQuery(interfaceName); + request_url = request_url.replace("{interface-name}", encoded_vnf) ; + URL http_req_url = new URL(request_url); + + HttpURLConnection con = getConfiguredConnection(http_req_url, HttpMethod.PUT); + + OutputStreamWriter osw = new OutputStreamWriter(con.getOutputStream()); + osw.write(json_text); + osw.flush(); + osw.close(); + + + LOGwriteFirstTrace("PUT", request_url); + LOGwriteDateTrace("hostname", hostname); + LOGwriteDateTrace("interface-name", interfaceName); + LOGwriteDateTrace("PInterface", json_text); + + // Check for errors + int responseCode = con.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_CREATED || responseCode == HttpURLConnection.HTTP_ACCEPTED || responseCode == HttpURLConnection.HTTP_NO_CONTENT) { + inputStream = con.getInputStream(); + } else { + inputStream = con.getErrorStream(); + } + + // Process the response + BufferedReader reader; + String line = null; + reader = new BufferedReader( new InputStreamReader( inputStream ) ); + + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_CREATED || responseCode == HttpURLConnection.HTTP_ACCEPTED || responseCode == HttpURLConnection.HTTP_NO_CONTENT) { + StringBuilder stringBuilder = new StringBuilder(); + + while( ( line = reader.readLine() ) != null ) { + stringBuilder.append( line ); + } + LOGwriteEndingTrace(responseCode, "SUCCESS", (stringBuilder != null) ? stringBuilder.toString() : "{no-data}"); + return true; + } else { + ErrorResponse errorresponse = mapper.readValue(reader, ErrorResponse.class); + LOGwriteEndingTrace(responseCode, "FAILURE", mapper.writeValueAsString(errorresponse)); + + throw new AAIServiceException(responseCode, errorresponse); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("postPInterfaceData", exc); + throw new AAIServiceException(exc); + } finally { + try { + if(inputStream != null) + inputStream.close(); + } catch (Exception exc) { + + } + } + } + + @Override + public boolean deletePInterfaceData(String hostname, String interfaceName, String resourceVersion) throws AAIServiceException { + boolean response = false; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("p-interface"); + request.addRequestProperty("p-interface.interface-name", interfaceName); + request.addRequestProperty("pserver.hostname", hostname); + response = executor.delete(request, resourceVersion); + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("deletePInterfaceData", exc); + throw new AAIServiceException(exc); + } + return response; + } + //================== End of PInterface ================= + //==================== SitePairSet ====================== + @Override + public SitePairSet requestSitePairSetData(String sitePairSetId) throws AAIServiceException { + SitePairSet response = null; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("site-pair-set"); + request.addRequestProperty("site-pair-set.site-pair-set-id", sitePairSetId); + String rv = executor.get(request); + if(rv != null) { + ObjectMapper mapper = getObjectMapper(); + response = mapper.readValue(rv, SitePairSet.class); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn(new Object(){}.getClass().getEnclosingMethod().getName(), exc); + throw new AAIServiceException(exc); + } + return response; + } + + @Override + public boolean postSitePairSetData(String linkName, SitePairSet request) throws AAIServiceException { + InputStream inputStream = null; + + try { + + ObjectMapper mapper = getObjectMapper(); + String json_text = mapper.writeValueAsString(request); + + SSLSocketFactory sockFact = CTX.getSocketFactory(); + + String request_url = target_uri+site_pair_set_path; + String encoded_vnf = encodeQuery(linkName); + request_url = request_url.replace("{site-pair-set-id}", encoded_vnf) ; + URL http_req_url = new URL(request_url); + + HttpURLConnection con = getConfiguredConnection(http_req_url, HttpMethod.PUT); + + OutputStreamWriter osw = new OutputStreamWriter(con.getOutputStream()); + osw.write(json_text); + osw.flush(); + osw.close(); + + + LOGwriteFirstTrace("PUT", request_url); + LOGwriteDateTrace("link-name", linkName); + LOGwriteDateTrace("SitePairSet", json_text); + + // Check for errors + int responseCode = con.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_CREATED || responseCode == HttpURLConnection.HTTP_ACCEPTED || responseCode == HttpURLConnection.HTTP_NO_CONTENT) { + inputStream = con.getInputStream(); + } else { + inputStream = con.getErrorStream(); + } + + // Process the response + BufferedReader reader; + String line = null; + reader = new BufferedReader( new InputStreamReader( inputStream ) ); + + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_CREATED || responseCode == HttpURLConnection.HTTP_ACCEPTED || responseCode == HttpURLConnection.HTTP_NO_CONTENT) { + StringBuilder stringBuilder = new StringBuilder(); + + while( ( line = reader.readLine() ) != null ) { + stringBuilder.append( line ); + } + LOGwriteEndingTrace(responseCode, "SUCCESS", (stringBuilder != null) ? stringBuilder.toString() : "{no-data}"); + return true; + } else { + ErrorResponse errorresponse = mapper.readValue(reader, ErrorResponse.class); + LOGwriteEndingTrace(responseCode, "FAILURE", mapper.writeValueAsString(errorresponse)); + + throw new AAIServiceException(responseCode, errorresponse); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("postSitePairSetData", exc); + throw new AAIServiceException(exc); + } finally { + try { + if(inputStream != null) + inputStream.close(); + } catch (Exception exc) { + + } + } + } + + @Override + public boolean deleteSitePairSetData(String linkName, String resourceVersion) throws AAIServiceException { + boolean response = false; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("site-pair-set"); + request.addRequestProperty("site-pair-set.site-pair-set-id", linkName); + response = executor.delete(request, resourceVersion); + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("deleteSitePairSetData", exc); + throw new AAIServiceException(exc); + } + + return response; + } + //================== End of SitePairSet ================= + //==================== Service ====================== + @Override + public Service requestServiceData(String serviceId) throws AAIServiceException { + Service response = null; + InputStream inputStream = null; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("service"); + request.addRequestProperty("service.service-id", serviceId); + + + String rv = executor.get(request); + if(rv != null) { + ObjectMapper mapper = getObjectMapper(); + response = mapper.readValue(rv, Service.class); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("requestServiceData", exc); + throw new AAIServiceException(exc); + } + return response; + } + + @Override + public boolean postServiceData(String linkName, Service request) throws AAIServiceException { + InputStream inputStream = null; + + try { + + ObjectMapper mapper = getObjectMapper(); + String json_text = mapper.writeValueAsString(request); + + SSLSocketFactory sockFact = CTX.getSocketFactory(); + + String request_url = target_uri+service_path; + String encoded_vnf = encodeQuery(linkName); + request_url = request_url.replace("{service-id}", encoded_vnf) ; + URL http_req_url = new URL(request_url); + + HttpURLConnection con = getConfiguredConnection(http_req_url, HttpMethod.PUT); + + OutputStreamWriter osw = new OutputStreamWriter(con.getOutputStream()); + osw.write(json_text); + osw.flush(); + osw.close(); + + + LOGwriteFirstTrace("PUT", request_url); + LOGwriteDateTrace("service-id", linkName); + LOGwriteDateTrace("Service", json_text); + + // Check for errors + int responseCode = con.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_CREATED || responseCode == HttpURLConnection.HTTP_ACCEPTED || responseCode == HttpURLConnection.HTTP_NO_CONTENT) { + inputStream = con.getInputStream(); + } else { + inputStream = con.getErrorStream(); + } + + // Process the response + BufferedReader reader; + String line = null; + reader = new BufferedReader( new InputStreamReader( inputStream ) ); + + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_CREATED || responseCode == HttpURLConnection.HTTP_ACCEPTED || responseCode == HttpURLConnection.HTTP_NO_CONTENT) { + StringBuilder stringBuilder = new StringBuilder(); + + while( ( line = reader.readLine() ) != null ) { + stringBuilder.append( line ); + } + LOGwriteEndingTrace(responseCode, "SUCCESS", (stringBuilder != null) ? stringBuilder.toString() : "{no-data}"); + return true; + } else { + ErrorResponse errorresponse = mapper.readValue(reader, ErrorResponse.class); + LOGwriteEndingTrace(responseCode, "FAILURE", mapper.writeValueAsString(errorresponse)); + + throw new AAIServiceException(responseCode, errorresponse); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("postServiceData", exc); + throw new AAIServiceException(exc); + } finally { + try { + if(inputStream != null) + inputStream.close(); + } catch (Exception exc) { + + } + } + } + + @Override + public boolean deleteServiceData(String service_id, String resourceVersion) throws AAIServiceException { + boolean response = false; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("service"); + request.addRequestProperty("service.service-id", service_id); + response = executor.delete(request, resourceVersion); + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("deleteServiceData", exc); + throw new AAIServiceException(exc); + } + + return response; + } + //================== End of Service ================= + + + + // 1507 - Request + @Override + public VServer dataChangeRequestVServerData(URL url) throws AAIServiceException { + + if(url == null) { + throw new NullPointerException(); + } + + return this.getResource(url.toString(), VServer.class); + } + + @Override + public Pserver dataChangeRequestPServerData(URL url) throws AAIServiceException { + + if(url == null) { + throw new NullPointerException(); + } + + return this.getResource(url.toString(), Pserver.class); + } + + @Override + public CtagPool dataChangeRequestCtagPoolData(URL url) throws AAIServiceException { + + if(url == null) { + throw new NullPointerException(); + } + + return this.getResource(url.toString(), CtagPool.class); + } + + @Override + public VplsPe dataChangeRequestVplsPeData(URL url) throws AAIServiceException { + + if(url == null) { + throw new NullPointerException(); + } + + return this.getResource(url.toString(), VplsPe.class); + } + + @Override + public Vpe dataChangeRequestVpeData(URL url) throws AAIServiceException { + + if(url == null) { + throw new NullPointerException(); + } + + return this.getResource(url.toString(), Vpe.class); + } + + @Override + public DvsSwitch dataChangeRequestDvsSwitchData(URL url) throws AAIServiceException { + + if(url == null) { + throw new NullPointerException(); + } + + return this.getResource(url.toString(), DvsSwitch.class); + } + + @Override + public OamNetwork dataChangeRequestOAMNetworkData(URL url) throws AAIServiceException { + + if(url == null) { + throw new NullPointerException(); + } + + return this.getResource(url.toString(), OamNetwork.class); + } + + @Override + public AvailabilityZone dataChangeRequestAvailabilityZoneData(URL url) throws AAIServiceException { + + if(url == null) { + throw new NullPointerException(); + } + + return this.getResource(url.toString(), AvailabilityZone.class); + } + + @Override + public Complex dataChangeRequestComplexData(URL url) throws AAIServiceException { + + if(url == null) { + throw new NullPointerException(); + } + + return this.getResource(url.toString(), Complex.class); + } + + /* DELETE */ + public boolean dataChangeDeleteVServerData(URL url) throws AAIServiceException { + + if(url == null) { + throw new NullPointerException(); + } + + return deleteAAIEntity(url, new Object(){}.getClass().getEnclosingMethod().getName()); + } + + public boolean dataChangeDeleteCtagPoolData(URL url) throws AAIServiceException { + + if(url == null) { + throw new NullPointerException(); + } + + return deleteAAIEntity(url, new Object(){}.getClass().getEnclosingMethod().getName()); + } + + public boolean dataChangeDeleteVplsPeData(URL url) throws AAIServiceException { + + if(url == null) { + throw new NullPointerException(); + } + + return deleteAAIEntity(url, new Object(){}.getClass().getEnclosingMethod().getName()); + } + + public boolean dataChangeDeleteVpeData(URL url) throws AAIServiceException { + + if(url == null) { + throw new NullPointerException(); + } + + return deleteAAIEntity(url, new Object(){}.getClass().getEnclosingMethod().getName()); + } + + public boolean dataChangeDeleteDvsSwitchData(URL url) throws AAIServiceException { + + if(url == null) { + throw new NullPointerException(); + } + + return deleteAAIEntity(url, new Object(){}.getClass().getEnclosingMethod().getName()); + } + //OAM-Network: + public boolean dataChangeDeleteOAMNetworkData(URL url) throws AAIServiceException { + + if(url == null) { + throw new NullPointerException(); + } + + return deleteAAIEntity(url, new Object(){}.getClass().getEnclosingMethod().getName()); + } + //Availability-Zone: + public boolean dataChangeDeleteAvailabilityZoneData(URL url) throws AAIServiceException { + + if(url == null) { + throw new NullPointerException(); + } + + return deleteAAIEntity(url, new Object(){}.getClass().getEnclosingMethod().getName()); + } + //Complex: + public boolean dataChangeDeleteComplexData(URL url) throws AAIServiceException { + + if(url == null) { + throw new NullPointerException(); + } + + return deleteAAIEntity(url, new Object(){}.getClass().getEnclosingMethod().getName()); + } + + private boolean deleteAAIEntity(URL url, String caller) throws AAIServiceException { + + if(url == null) { + throw new NullPointerException(); + } + + boolean response = false; + InputStream inputStream = null; + + try { + URL http_req_url = url; + + HttpURLConnection con = getConfiguredConnection(http_req_url, HttpMethod.DELETE); + +// SSLSocketFactory sockFact = CTX.getSocketFactory(); +// con.setSSLSocketFactory( sockFact ); + + LOGwriteFirstTrace("DELETE", http_req_url.toString()); + + + // Check for errors + int responseCode = con.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_NO_CONTENT) { + inputStream = con.getInputStream(); + } else { + inputStream = con.getErrorStream(); + } + + // Process the response + LOG.debug("HttpURLConnection result:" + responseCode); + if(inputStream == null) inputStream = new ByteArrayInputStream("".getBytes(StandardCharsets.UTF_8)); + BufferedReader reader = new BufferedReader( new InputStreamReader( inputStream ) ); + String line = null; + + ObjectMapper mapper = getObjectMapper(); + + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_NO_CONTENT) { + StringBuilder stringBuilder = new StringBuilder(); + + while( ( line = reader.readLine() ) != null ) { + stringBuilder.append( line ); + } + LOGwriteEndingTrace(responseCode, "SUCCESS", stringBuilder.toString()); + response = true; + } else if(responseCode == HttpURLConnection.HTTP_NOT_FOUND ) { + LOGwriteEndingTrace(responseCode, "HTTP_NOT_FOUND", "Entry does not exist."); + response = false; + } else { + ErrorResponse errorresponse = mapper.readValue(reader, ErrorResponse.class); + LOGwriteEndingTrace(responseCode, "FAILURE", mapper.writeValueAsString(errorresponse)); + throw new AAIServiceException(responseCode, errorresponse); + } + + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn(caller, exc); + throw new AAIServiceException(exc); + } finally { + if(inputStream != null){ + try { + inputStream.close(); + } catch(Exception exc) { + + } + } + } + return response; + } + + /** + * Generic method to GET json data from an A&AI callback URL. + * Then convert that json to an Object. + * If successful the Object is attempted to be cast to the type parameter. + * + * @param key + * callback url for A&AI + * @param type + * the class of object that A&AI will return + * @return the object created from json or null if the response code is not 200 + * + * @throws AAIServiceException + * if empty or null key and or type or there's an error with processing + */ + public T dataChangeRequestAaiData(String key, Class type) throws AAIServiceException { + if (StringUtils.isEmpty(key) || type == null) { + throw new AAIServiceException("Key is empty or null and or type is null"); + } + + T response = null; + + SvcLogicContext ctx = new SvcLogicContext(); + if(!key.contains(" = ") && isValidURL(key)) { + key = String.format("selflink = '%s'", key); + } + HashMap nameValues = keyToHashMap(key, ctx); + + SelfLinkRequest request = new SelfLinkRequest(type); + request.processRequestPathValues(nameValues); + Object obj = this.getExecutor().query(request, type); + response = type.cast(obj); + + return response != null ? type.cast(response) : response; + } + + @Override + public Pserver requestPServerData(String hostname) throws AAIServiceException { + Pserver response = null; + InputStream inputStream = null; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("pserver"); + request.addRequestProperty("pserver.hostname", hostname); + + + String rv = executor.get(request); + if(rv != null) { + ObjectMapper mapper = getObjectMapper(); + response = mapper.readValue(rv, Pserver.class); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("requestPServerData", exc); + throw new AAIServiceException(exc); + } + return response; + } + + @Override + public boolean postPServerData(String hostname, Pserver data) throws AAIServiceException { + try { + AAIRequest request = AAIRequest.getRequestFromResource("pserver"); + request.addRequestProperty("pserver.hostname", hostname); + request.setRequestObject(data); + Object response = executor.post(request); + return true; + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn(new Object(){}.getClass().getEnclosingMethod().getName(), exc); + throw new AAIServiceException(exc); + } + } + + @Override + public boolean deletePServerData(String hostname, String resourceVersion) throws AAIServiceException { + boolean response = false; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("pserver"); + request.addRequestProperty("pserver.hostname", hostname); + response = executor.delete(request, resourceVersion); + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("deletePServerData", exc); + throw new AAIServiceException(exc); + } + + return response; + } + + + @Override + public L3Network requestL3NetworkData(String networkId) throws AAIServiceException { + L3Network response = null; + InputStream inputStream = null; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("l3-network"); + request.addRequestProperty("l3-network.network-id", networkId); + + String rv = executor.get(request); + if(rv != null) { + ObjectMapper mapper = getObjectMapper(); + response = mapper.readValue(rv, L3Network.class); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("requestL3NetworkData", exc); + throw new AAIServiceException(exc); + } + return response; + } + + @Override + public L3Network requestL3NetworkQueryByName(String networkName) throws AAIServiceException { + L3Network response = null; + InputStream inputStream = null; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("l3-network"); + request.addRequestProperty("l3-network.network-name", networkName); + + String rv = executor.get(request); + if(rv != null) { + ObjectMapper mapper = getObjectMapper(); + response = mapper.readValue(rv, L3Network.class); + } + + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("requestL3NetworkQueryByName", exc); + throw new AAIServiceException(exc); + } finally { + if(inputStream != null){ + try { + inputStream.close(); + } catch(Exception exc) { + + } + } + } + return response; + } + + @Override + public boolean postL3NetworkData(String networkId, L3Network data) throws AAIServiceException { + try { + AAIRequest request = AAIRequest.getRequestFromResource("l3-network"); + request.addRequestProperty("l3-network.network-id", networkId); + request.setRequestObject(data); + Object response = executor.post(request); + return true; + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn(new Object(){}.getClass().getEnclosingMethod().getName(), exc); + throw new AAIServiceException(exc); + } + } + + @Override + public boolean deleteL3NetworkData(String networkId, String resourceVersion) throws AAIServiceException { + boolean response = false; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("l3-network"); + request.addRequestProperty("l3-network.network-id", networkId); + response = executor.delete(request, resourceVersion); + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("deleteL3NetworkData", exc); + throw new AAIServiceException(exc); + } + + return response; + } + + + @Override + public VpnBinding requestVpnBindingData(String vpnId) throws AAIServiceException { + VpnBinding response = null; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("vpn-binding"); + request.addRequestProperty("vpn-binding.vpn-id", vpnId); + + String rv = executor.get(request); + if(rv != null) { + ObjectMapper mapper = getObjectMapper(); + response = mapper.readValue(rv, VpnBinding.class); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("requestVpnBindingData", exc); + throw new AAIServiceException(exc); + } + return response; + } + + @Override + public boolean deleteVpnBindingData(String vpnId, String resourceVersion) throws AAIServiceException { + boolean response = false; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("vpn-binding"); + request.addRequestProperty("vpn-binding.vpn-id", vpnId); + response = executor.delete(request, resourceVersion); + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("deleteVpnBindingData", exc); + throw new AAIServiceException(exc); + } + return response; + } + + + @Override + public VnfImage requestVnfImageData(String att_uuid) throws AAIServiceException { + VnfImage response = null; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("vnf-image"); + request.addRequestProperty("vnf-image.att-uuid", att_uuid); + + String rv = executor.get(request); + if(rv != null) { + ObjectMapper mapper = getObjectMapper(); + response = mapper.readValue(rv, VnfImage.class); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("requestVnfImageData", exc); + throw new AAIServiceException(exc); + } + return response; + } + + @Override + public VnfImage requestVnfImageDataByVendorModel(String vendor, String model) throws AAIServiceException { + return requestVnfImageDataByVendorModelVersion(vendor, model, null); + } + + @Override + public VnfImage requestVnfImageDataByVendorModelVersion(String vendor, String model, String version) throws AAIServiceException + { + List responseList = new ArrayList(); + VnfImage response = null; + InputStream inputStream = null; + + try { + String request_url = target_uri+vnf_image_query_path + (version==null? "": "&application-version={application_version}"); + request_url = request_url.replace("{application_vendor}", encodeQuery(vendor)) ; + request_url = request_url.replace("{application_model}", encodeQuery(model)) ; + if(version != null) { + request_url = request_url.replace("{application_version}", encodeQuery(version)) ; + } + URL http_req_url = new URL(request_url); + + HttpURLConnection con = getConfiguredConnection(http_req_url, HttpMethod.GET); + + LOGwriteFirstTrace(HttpMethod.GET, http_req_url.toString()); + LOGwriteDateTrace("application_vendor", vendor); + LOGwriteDateTrace("application_model", model); + if(version != null) { + LOGwriteDateTrace("application_version", version); + } + + // Check for errors + int responseCode = con.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + inputStream = con.getInputStream(); + } else { + inputStream = con.getErrorStream(); + } + + // Process the response + LOG.debug("HttpURLConnection result:" + responseCode); + if(inputStream == null) inputStream = new ByteArrayInputStream("".getBytes(StandardCharsets.UTF_8)); + BufferedReader reader = new BufferedReader( new InputStreamReader( inputStream ) ); + + ObjectMapper mapper = getObjectMapper(); + + if (responseCode == HttpURLConnection.HTTP_OK) { +// StringBuilder stringBuilder = new StringBuilder("\n"); +// String line = null; +// while( ( line = reader.readLine() ) != null ) { +// stringBuilder.append("\n").append( line ); +// } +// LOG.info(stringBuilder.toString()); + response = mapper.readValue(reader, VnfImage.class); + String original_buffer = mapper.writeValueAsString(response); + LOGwriteEndingTrace(HttpURLConnection.HTTP_OK, "SUCCESS", original_buffer); + if(response.getApplicationVendor() == null /*&& response.getAdditionalProperties() != null && !response.getAdditionalProperties().isEmpty()*/){ + LOG.warn("A List of multiple VNF-IMAGE entries has been returned"); + VnfImages listOfObjects = mapper.readValue(original_buffer, VnfImages.class); + if(!listOfObjects.getVnfImage().isEmpty()) { + response = listOfObjects.getVnfImage().get(0); + } + } + } else if(responseCode == HttpURLConnection.HTTP_NOT_FOUND ) { + LOGwriteEndingTrace(responseCode, "HTTP_NOT_FOUND", "Entry does not exist."); + return response; + } else { + ErrorResponse errorresponse = mapper.readValue(reader, ErrorResponse.class); + LOGwriteEndingTrace(responseCode, "FAILURE", mapper.writeValueAsString(errorresponse)); + throw new AAIServiceException(responseCode, errorresponse); + } + + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("requestVnfImageData", exc); + throw new AAIServiceException(exc); + } finally { + if(inputStream != null){ + try { + inputStream.close(); + } catch(Exception exc) { + + } + } + } + return response; + } + + + public boolean sendNotify(NotifyEvent event, String serviceInstanceId, String pathCode) throws AAIServiceException { + InputStream inputStream = null; + + try { + + String selfLink = selflink_fqdn; + if(SELFLINK_AVPN != null && SELFLINK_AVPN.equals(pathCode)) { + selfLink = selflink_avpn; + } + selfLink = selfLink.replace("{service-instance-id}", encodeQuery(serviceInstanceId)); + event.setSelflink(selfLink); + + ObjectMapper mapper = getObjectMapper(); + String json_text = mapper.writeValueAsString(event); + + SSLSocketFactory sockFact = CTX.getSocketFactory(); + + String request_url = target_uri+ubb_notify_path; + URL http_req_url = new URL(request_url); + + HttpURLConnection con = getConfiguredConnection(http_req_url, HttpMethod.PUT); + + OutputStreamWriter osw = new OutputStreamWriter(con.getOutputStream()); + osw.write(json_text); + osw.flush(); + osw.close(); + + + LOGwriteFirstTrace("PUT", request_url); + LOGwriteDateTrace("NotifyEvent", json_text); + + // Check for errors + int responseCode = con.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_CREATED || responseCode == HttpURLConnection.HTTP_ACCEPTED || responseCode == HttpURLConnection.HTTP_NO_CONTENT) { + inputStream = con.getInputStream(); + } else { + inputStream = con.getErrorStream(); + } + + // Process the response + BufferedReader reader; + String line = null; + reader = new BufferedReader( new InputStreamReader( inputStream ) ); + + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_CREATED || responseCode == HttpURLConnection.HTTP_ACCEPTED || responseCode == HttpURLConnection.HTTP_NO_CONTENT) { + StringBuilder stringBuilder = new StringBuilder(); + + while( ( line = reader.readLine() ) != null ) { + stringBuilder.append( line ); + } + LOGwriteEndingTrace(responseCode, "SUCCESS", (stringBuilder != null) ? stringBuilder.toString() : "{no-data}"); + return true; + } else { + ErrorResponse errorresponse = mapper.readValue(reader, ErrorResponse.class); + LOGwriteEndingTrace(responseCode, "FAILURE", mapper.writeValueAsString(errorresponse)); + + throw new AAIServiceException(responseCode, errorresponse); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("sendNotify", exc); + throw new AAIServiceException(exc); + } finally { + try { + if(inputStream != null) + inputStream.close(); + } catch (Exception exc) { + + } + } + } + + @Override + public SearchResults requestNodeQuery(String node_type, String entityIdentifier, String entityName) throws AAIServiceException { + SearchResults response = null; + InputStream inputStream = null; + + try { + String request_url = target_uri+query_nodes_path; + request_url = request_url.replace("{node-type}", encodeQuery(node_type)) ; + request_url = request_url.replace("{entity-identifier}", entityIdentifier) ; + request_url = request_url.replace("{entity-name}", encodeQuery(entityName)) ; + URL http_req_url = new URL(request_url); + + HttpURLConnection con = getConfiguredConnection(http_req_url, HttpMethod.GET); + + LOGwriteFirstTrace(HttpMethod.GET, http_req_url.toString()); + LOGwriteDateTrace("node_type", node_type); + LOGwriteDateTrace("vnf_name", entityName); + + // Check for errors + int responseCode = con.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + inputStream = con.getInputStream(); + } else { + inputStream = con.getErrorStream(); + } + + // Process the response + LOG.debug("HttpURLConnection result:" + responseCode); + if(inputStream == null) inputStream = new ByteArrayInputStream("".getBytes(StandardCharsets.UTF_8)); + BufferedReader reader = new BufferedReader( new InputStreamReader( inputStream ) ); + + ObjectMapper mapper = getObjectMapper(); + + if (responseCode == HttpURLConnection.HTTP_OK) { + response = mapper.readValue(reader, SearchResults.class); + LOGwriteEndingTrace(HttpURLConnection.HTTP_OK, "SUCCESS", mapper.writeValueAsString(response)); + } else if (responseCode == HttpURLConnection.HTTP_NOT_FOUND) { + LOGwriteEndingTrace(responseCode, "HTTP_NOT_FOUND", "Entry does not exist."); + return response; + } else { + ErrorResponse errorresponse = mapper.readValue(reader, ErrorResponse.class); + LOGwriteEndingTrace(responseCode, "FAILURE", mapper.writeValueAsString(errorresponse)); + throw new AAIServiceException(responseCode, errorresponse); + } + + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("requestNodeQuery", exc); + throw new AAIServiceException(exc); + } finally { + if(inputStream != null){ + try { + inputStream.close(); + } catch(Exception exc) { + + } + } + } + return response; + + } + + + @Override + public String requestDataByURL(URL url) throws AAIServiceException { + + if(url == null) { + throw new NullPointerException(); + } + + String response = null; + InputStream inputStream = null; + + try { + URL http_req_url = url; + + HttpURLConnection con = getConfiguredConnection(http_req_url, HttpMethod.GET); + + LOGwriteFirstTrace(HttpMethod.GET, http_req_url.toString()); + + // Check for errors + int responseCode = con.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + inputStream = con.getInputStream(); + } else { + inputStream = con.getErrorStream(); + } + + // Process the response + LOG.debug("HttpURLConnection result:" + responseCode); + if(inputStream == null) inputStream = new ByteArrayInputStream("".getBytes(StandardCharsets.UTF_8)); + BufferedReader reader = new BufferedReader( new InputStreamReader( inputStream ) ); + + ObjectMapper mapper = getObjectMapper(); + + if (responseCode == HttpURLConnection.HTTP_OK) { + StringBuilder stringBuilder = new StringBuilder("\n"); + String line = null; + while( ( line = reader.readLine() ) != null ) { + stringBuilder.append( line ); + } + LOG.info(stringBuilder.toString()); +// response = mapper.readValue(reader, String.class); + response = stringBuilder.toString(); + LOGwriteEndingTrace(HttpURLConnection.HTTP_OK, "SUCCESS", mapper.writeValueAsString(response)); + } else if(responseCode == HttpURLConnection.HTTP_NOT_FOUND ) { + LOGwriteEndingTrace(responseCode, "HTTP_NOT_FOUND", "Entry does not exist."); + response = null; + } else { + ErrorResponse errorresponse = mapper.readValue(reader, ErrorResponse.class); + LOGwriteEndingTrace(responseCode, "FAILURE", mapper.writeValueAsString(errorresponse)); + throw new AAIServiceException(responseCode, errorresponse); + } + + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("requestNetworkVceData", exc); + throw new AAIServiceException(exc); + } finally { + if(inputStream != null){ + try { + inputStream.close(); + } catch(Exception exc) { + + } + } + } + return response; + } + + + @Override + public GenericVnf requestGenericVnfeNodeQuery(String vnf_name) throws AAIServiceException { + + if(vnf_name == null) { + throw new NullPointerException(); + } + + GenericVnf entity = null; + SearchResults resp = this.requestNodeQuery("generic-vnf", "vnf-name", vnf_name); + + List resultDataList = resp.getResultData(); + + try { + for (ResultData datum : resultDataList) { + String data_type = datum.getResourceType(); + URL url = new URL(datum.getResourceLink()); + entity = this.getResource(url.toString(), GenericVnf.class); + } + } + catch (Exception e) + { + LOG.error("Caught exception", e); + } + return entity; + } + + @Override + public Vserver requestVServerDataByURL(URL url) throws AAIServiceException { + + if(url == null) { + throw new NullPointerException(); + } + + Vserver entity = null; + + try { + entity = this.getResource(url.toString(), Vserver.class); + } catch (AAIServiceException exc) { + throw exc; + } catch (Exception e) { + throw new AAIServiceException(e); + } + return entity; + } + + @Override + public URL requestVserverURLNodeQuery(String vserver_name) throws AAIServiceException { + + if(vserver_name == null) { + throw new NullPointerException(); + } + + URL entity = null; + SearchResults resp = this.requestNodeQuery("vserver", "vserver-name", vserver_name); + + List resultDataList = resp.getResultData(); + + try { + for (ResultData datum : resultDataList) { + String data_type = datum.getResourceType(); + entity = new URL(datum.getResourceLink()); + } + } catch (Exception e) { + throw new AAIServiceException(e); + } + return entity; + } + + class AAIRequestExecutor implements AAIExecutorInterface { + + @Override + public String get(AAIRequest request) throws AAIServiceException { + String response = null; + InputStream inputStream = null; + HttpURLConnection con = null; + URL requestUrl = null; + + String requestId = UUID.randomUUID().toString(); + + try { + + if(request.getRequestObject() != null) { + requestUrl = request.getRequestUrl(HttpMethod.POST, null); + requestUrl = appendDepth(requestUrl, request); + con = getConfiguredConnection(requestUrl, HttpMethod.POST); + String json_text = request.toJSONString(); + LOGwriteDateTrace("data", json_text); + logMetricRequest(requestId, "POST "+requestUrl.getPath(), json_text, requestUrl.getPath()); + OutputStreamWriter osw = new OutputStreamWriter(con.getOutputStream()); + osw.write(json_text); + osw.flush(); + } else { + requestUrl = request.getRequestUrl(HttpMethod.GET, null); + requestUrl = appendDepth(requestUrl, request); + con = getConfiguredConnection(requestUrl, HttpMethod.GET); + logMetricRequest(requestId, "GET "+requestUrl.getPath(), "", requestUrl.getPath()); + } + + // Check for errors + String responseMessage = con.getResponseMessage(); + int responseCode = con.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + inputStream = con.getInputStream(); + } else { + inputStream = con.getErrorStream(); + } + + // Process the response + LOG.debug("HttpURLConnection result:" + responseCode + " : " + responseMessage); + logMetricResponse(requestId, responseCode, responseMessage); + + if(inputStream == null) inputStream = new ByteArrayInputStream("".getBytes(StandardCharsets.UTF_8)); + BufferedReader reader = new BufferedReader( new InputStreamReader( inputStream ) ); + + ObjectMapper mapper = getObjectMapper(); + + if (responseCode == HttpURLConnection.HTTP_OK) { + StringBuilder stringBuilder = new StringBuilder(); + String line = null; + while( ( line = reader.readLine() ) != null ) { + stringBuilder.append( line ); + } + response = stringBuilder.toString(); + try { + Object object = mapper.readValue(response, Object.class); + LOGwriteEndingTrace(HttpURLConnection.HTTP_OK, responseMessage, mapper.writeValueAsString(object)); + } catch(Exception exc) { + LOGwriteEndingTrace(HttpURLConnection.HTTP_OK, responseMessage, mapper.writeValueAsString(response)); + } + } else if (responseCode == HttpURLConnection.HTTP_NOT_FOUND) { + LOGwriteEndingTrace(responseCode, responseMessage, "Entry does not exist."); + ErrorResponse errorresponse = null; + try { + errorresponse = mapper.readValue(reader, ErrorResponse.class); + } catch(Exception exc) { + errorresponse = new ErrorResponse(); + RequestError requestError = new RequestError(); + ServiceException serviceException = new ServiceException(); + serviceException.setText("Entry does not exist."); + requestError.setServiceException(serviceException); + errorresponse.setRequestError(requestError ); + } + throw new AAIServiceException(responseCode, errorresponse); + } else if (responseCode == HttpURLConnection.HTTP_UNAUTHORIZED) { + StringBuilder stringBuilder = new StringBuilder(); + String line = null; + while( ( line = reader.readLine() ) != null ) { + stringBuilder.append( line ); + } + LOGwriteEndingTrace(responseCode, responseMessage, stringBuilder.toString()); + ServiceException serviceException = new ServiceException(); + serviceException.setMessageId("HTTP_UNAUTHORIZED"); + serviceException.setText(stringBuilder.toString()); + RequestError requestError = new RequestError(); + requestError.setServiceException(serviceException); + ErrorResponse errorresponse = new ErrorResponse(); + errorresponse.setRequestError(requestError); + throw new AAIServiceException(responseCode, errorresponse); + } else { +// +// StringBuilder stringBuilder = new StringBuilder("\n"); +// String line = null; +// while( ( line = reader.readLine() ) != null ) { +// stringBuilder.append("\n").append( line ); +// } +// LOG.info(stringBuilder.toString()); +// +// ErrorResponse errorresponse = mapper.readValue(stringBuilder.toString(), ErrorResponse.class); + ErrorResponse errorresponse = mapper.readValue(reader, ErrorResponse.class); + LOGwriteEndingTrace(responseCode, responseMessage, mapper.writeValueAsString(errorresponse)); + throw new AAIServiceException(responseCode, errorresponse); + } + + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("GET", exc); + throw new AAIServiceException(exc); + } finally { + if(inputStream != null){ + try { + inputStream.close(); + } catch(Exception exc) { + + } + } + } + return response; + } + + private URL appendDepth(URL requestUrl, AAIRequest request) throws MalformedURLException { + + String depth = request.requestProperties.getProperty("depth", "1"); + String path = requestUrl.toString(); + if(path.contains("?depth=") || path.contains("&depth=")) { + return requestUrl; + } else { + if(path.contains("?")) { + path = String.format("%s&depth=%s", path, depth); + } else { + path = String.format("%s?depth=%s", path, depth); + } + return new URL(path); + } + } + + @Override + public String post(AAIRequest request) throws AAIServiceException { + InputStream inputStream = null; + String requestId = UUID.randomUUID().toString(); + + try { + String resourceVersion = null; + AAIDatum instance = request.getRequestObject(); + + Method getResourceVersionMethod = instance.getClass().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(); + } + } + + URL requestUrl = null; + HttpURLConnection con = getConfiguredConnection(requestUrl = request.getRequestUrl(HttpMethod.PUT, resourceVersion), HttpMethod.PUT); + ObjectMapper mapper = getObjectMapper(); + String json_text = request.toJSONString(); + + LOGwriteDateTrace("data", json_text); + logMetricRequest(requestId, "PUT "+requestUrl.getPath(), json_text, requestUrl.getPath()); + + OutputStreamWriter osw = new OutputStreamWriter(con.getOutputStream()); + osw.write(json_text); + osw.flush(); + + // Check for errors + String responseMessage = con.getResponseMessage(); + int responseCode = con.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_CREATED || responseCode == HttpURLConnection.HTTP_ACCEPTED || responseCode == HttpURLConnection.HTTP_NO_CONTENT) { + inputStream = con.getInputStream(); + } else { + inputStream = con.getErrorStream(); + } + + LOG.debug("HttpURLConnection result:" + responseCode + " : " + responseMessage); + logMetricResponse(requestId,responseCode, responseMessage); + + // Process the response + BufferedReader reader; + String line = null; + reader = new BufferedReader( new InputStreamReader( inputStream ) ); + mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_CREATED || responseCode == HttpURLConnection.HTTP_ACCEPTED || responseCode == HttpURLConnection.HTTP_NO_CONTENT) { + StringBuilder stringBuilder = new StringBuilder(); + + while( ( line = reader.readLine() ) != null ) { + stringBuilder.append( line ); + } + LOGwriteEndingTrace(responseCode, responseMessage, (stringBuilder != null) ? stringBuilder.toString() : "{no-data}"); + return stringBuilder.toString(); + } else { + ErrorResponse errorresponse = mapper.readValue(reader, ErrorResponse.class); + LOGwriteEndingTrace(responseCode, responseMessage, mapper.writeValueAsString(errorresponse)); + + throw new AAIServiceException(responseCode, errorresponse); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("AAIRequestExecutor.post", exc); + throw new AAIServiceException(exc); + } finally { + try { + if(inputStream != null) + inputStream.close(); + } catch (Exception exc) { + + } + } + } + + @Override + public Boolean delete(AAIRequest request, String resourceVersion) throws AAIServiceException { + Boolean response = null; + InputStream inputStream = null; + String requestId = UUID.randomUUID().toString(); + + if(resourceVersion == null) { + throw new AAIServiceException("resource-version is required for DELETE request"); + } + + try { + URL requestUrl = null; + HttpURLConnection conn = getConfiguredConnection(requestUrl = request.getRequestUrl(HttpMethod.DELETE, resourceVersion), HttpMethod.DELETE); + logMetricRequest(requestId, "DELETE "+requestUrl.getPath(), "", requestUrl.getPath()); + conn.setDoOutput(true); +// if(request.isDeleteDataRequired()) { +// String json_text = request.toJSONString(); +// +// LOGwriteDateTrace("data", json_text); +// OutputStream os = con.getOutputStream(); +// OutputStreamWriter osw = new OutputStreamWriter(con.getOutputStream()); +// osw.write(json_text); +// osw.flush(); +// } + + // Check for errors + String responseMessage = conn.getResponseMessage(); + int responseCode = conn.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_NO_CONTENT) { + inputStream = conn.getInputStream(); + } else { + inputStream = conn.getErrorStream(); + } + + // Process the response + LOG.debug("HttpURLConnection result:" + responseCode + " : " + responseMessage); + logMetricResponse(requestId,responseCode, responseMessage); + + if(inputStream == null) inputStream = new ByteArrayInputStream("".getBytes(StandardCharsets.UTF_8)); + BufferedReader reader = new BufferedReader( new InputStreamReader( inputStream ) ); + String line = null; + + ObjectMapper mapper = getObjectMapper(); + + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_NO_CONTENT) { + StringBuilder stringBuilder = new StringBuilder(); + + while( ( line = reader.readLine() ) != null ) { + stringBuilder.append( line ); + } + LOGwriteEndingTrace(responseCode, responseMessage, stringBuilder.toString()); + response = true; + } else if(responseCode == HttpURLConnection.HTTP_NOT_FOUND ) { + LOGwriteEndingTrace(responseCode, responseMessage, "Entry does not exist."); + response = false; + } else { + ErrorResponse errorresponse = mapper.readValue(reader, ErrorResponse.class); + LOGwriteEndingTrace(responseCode, responseMessage, mapper.writeValueAsString(errorresponse)); + throw new AAIServiceException(responseCode, errorresponse); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("delete", exc); + throw new AAIServiceException(exc); + } finally { + if(inputStream != null){ + try { + inputStream.close(); + } catch(Exception exc) { + + } + } + } + return response; + } + + @Override + public Object query(AAIRequest request, Class clas) throws AAIServiceException { + Object response = null; + InputStream inputStream = null; + HttpURLConnection con = null; + URL requestUrl = null; + String requestId = UUID.randomUUID().toString(); + + try { + con = getConfiguredConnection(requestUrl = request.getRequestQueryUrl(HttpMethod.GET), HttpMethod.GET); + logMetricRequest(requestId, "GET "+requestUrl.getPath(), "", requestUrl.getPath()); + + // Check for errors + String responseMessage = con.getResponseMessage(); + int responseCode = con.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + inputStream = con.getInputStream(); + } else { + inputStream = con.getErrorStream(); + } + + logMetricResponse(requestId,responseCode, responseMessage); + ObjectMapper mapper = getObjectMapper(); + + if (responseCode == HttpURLConnection.HTTP_OK) { + // Process the response + BufferedReader reader = new BufferedReader( new InputStreamReader( inputStream ) ); + response = mapper.readValue(reader, clas); + LOGwriteEndingTrace(HttpURLConnection.HTTP_OK, "SUCCESS", mapper.writeValueAsString(response)); + } else if (responseCode == HttpURLConnection.HTTP_NOT_FOUND) { + LOGwriteEndingTrace(responseCode, "HTTP_NOT_FOUND", "Entry does not exist."); + return response; + } else { + BufferedReader reader = new BufferedReader( new InputStreamReader( inputStream ) ); + ErrorResponse errorresponse = mapper.readValue(reader, ErrorResponse.class); + LOGwriteEndingTrace(responseCode, "FAILURE", mapper.writeValueAsString(errorresponse)); + throw new AAIServiceException(responseCode, errorresponse); + } + + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("GET", exc); + throw new AAIServiceException(exc); + } finally { + if(inputStream != null){ + try { + inputStream.close(); + } catch(Exception exc) { + + } + } + con = null; + } + return response; + } + + @Override + public Boolean patch(AAIRequest request, String resourceVersion) throws AAIServiceException { + InputStream inputStream = null; + String requestId = UUID.randomUUID().toString(); + + try { + AAIDatum instance = request.getRequestObject(); + if(instance instanceof ResourceVersion) { + resourceVersion = ((ResourceVersion)instance).getResourceVersion(); + } + + URL requestUrl = null; + HttpURLConnection con = getConfiguredConnection(requestUrl = request.getRequestUrl("PATCH", resourceVersion), "PATCH"); + ObjectMapper mapper = getObjectMapper(); + String json_text = request.toJSONString(); + + LOGwriteDateTrace("data", json_text); + logMetricRequest(requestId, "PATCH "+requestUrl.getPath(), json_text, requestUrl.getPath()); + + OutputStreamWriter osw = new OutputStreamWriter(con.getOutputStream()); + osw.write(json_text); + osw.flush(); + + // Check for errors + String responseMessage = con.getResponseMessage(); + int responseCode = con.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_CREATED || responseCode == HttpURLConnection.HTTP_ACCEPTED || responseCode == HttpURLConnection.HTTP_NO_CONTENT) { + inputStream = con.getInputStream(); + } else { + inputStream = con.getErrorStream(); + } + + LOG.info("HttpURLConnection result: " + responseCode + " : " + responseMessage); + logMetricResponse(requestId,responseCode, responseMessage); + + // Process the response + BufferedReader reader; + String line = null; + reader = new BufferedReader( new InputStreamReader( inputStream ) ); + mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_CREATED || responseCode == HttpURLConnection.HTTP_ACCEPTED || responseCode == HttpURLConnection.HTTP_NO_CONTENT) { + StringBuilder stringBuilder = new StringBuilder(); + + while( ( line = reader.readLine() ) != null ) { + stringBuilder.append( line ); + } + LOGwriteEndingTrace(responseCode, responseMessage, (stringBuilder != null) ? stringBuilder.toString() : "{no-data}"); + return true; + } else { + StringBuilder stringBuilder = new StringBuilder(); + + while( ( line = reader.readLine() ) != null ) { + stringBuilder.append("\n").append( line ); + } + LOG.info(stringBuilder.toString()); + + + ErrorResponse errorresponse = mapper.readValue(reader, ErrorResponse.class); + LOGwriteEndingTrace(responseCode, responseMessage, mapper.writeValueAsString(errorresponse)); + + throw new AAIServiceException(responseCode, errorresponse); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("AAIRequestExecutor.patch", exc); + throw new AAIServiceException(exc); + } finally { + try { + if(inputStream != null) + inputStream.close(); + } catch (Exception exc) { + + } + } + } + } + + @Override + public Tenant requestTenantData(String tenant_id, String cloudOwner, String cloudRegionId) throws AAIServiceException { + Tenant response = null; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("tenant"); + request.addRequestProperty("tenant.tenant-id", tenant_id); + request.addRequestProperty("cloud-region.cloud-owner", cloudOwner); + request.addRequestProperty("cloud-region.cloud-region-id", cloudRegionId); + + String rv = executor.get(request); + if(rv != null) { + ObjectMapper mapper = getObjectMapper(); + response = mapper.readValue(rv, Tenant.class); + } + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("requestTenantData", exc); + throw new AAIServiceException(exc); + } + + return response; + } + + @Override + public Tenant requestTenantDataByName(String tenant_name, String cloudOwner, String cloudRegionId) throws AAIServiceException { + Tenant response = null; + + try { + AAIRequest request = AAIRequest.getRequestFromResource("tenant"); + request.addRequestProperty("tenant.tenant-name", tenant_name); + request.addRequestProperty("cloud-region.cloud-owner", cloudOwner); + request.addRequestProperty("cloud-region.cloud-region-id", cloudRegionId); + Object rv = executor.query(request, Tenant.class); + if(rv == null) + return (Tenant)null; + else + response = (Tenant)rv; + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("requestTenantDataByName", exc); + throw new AAIServiceException(exc); + } + + return response; + } + + + @Override + public boolean postTenantData(String tenant_id, String cloudOwner, String cloudRegionId, Tenant tenannt) throws AAIServiceException { + try { + AAIRequest request = AAIRequest.getRequestFromResource("tenant"); + request.addRequestProperty("tenant.tenant-id", tenant_id); + request.addRequestProperty("cloud-region.cloud-owner", cloudOwner); + request.addRequestProperty("cloud-region.cloud-region-id", cloudRegionId); + request.setRequestObject(tenannt); + Object response = executor.post(request); + return true; + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("postTenantData", exc); + throw new AAIServiceException(exc); + } + } + + + @Override + public String getTenantIdFromVserverUrl(URL url) { + + String path = url.getPath(); + + String[] split = path.split("/tenants/tenant/"); + if(split.length > 1) { + split = split[1].split("/"); + return split[0]; + } else { + return null; + } + } + + @Override + public String getCloudOwnerFromVserverUrl(URL url) { + + String path = url.getPath(); + + String[] split = path.split("/cloud-regions/cloud-region/"); + if(split.length > 1) { + split = split[1].split("/"); + return split[0]; + } else { + return null; + } + } + + @Override + public String getCloudRegionFromVserverUrl(URL url) { + + String path = url.getPath(); + + String[] split = path.split("/cloud-regions/cloud-region/"); + if(split.length > 1) { + split = split[1].split("/"); + return split[1]; + } else { + return null; + } + } + + @Override + public String getVServerIdFromVserverUrl(URL url, String tenantId) { + String pattern = network_vserver_path; + pattern = pattern.replace("{tenant-id}", tenantId); + + int end = pattern.indexOf("{vserver-id}"); + String prefix = pattern.substring(0, end); + + String path = url.getPath(); + + if(path.startsWith(prefix)) { + path = path.substring(prefix.length()); + } + + return path; + } + + protected Logger getLogger(){ + return LOG; + } + + + @Override + public AAIRequestExecutor getExecutor() { + return executor; + } + + /** + * Creates a current time stamp in UTC i.e. 2016-03-08T22:15:13.343Z. + * If there are any parameters the values are appended to the time stamp. + * + * @param parameters + * values to be appended to current time stamp + * @param ctx + * used to set an attribute for a DG + * @throws SvcLogicException + */ + public void setStatusMethod(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + if (ctx == null) { + throw new SvcLogicException("SvcLogicContext is null."); + } + + StringBuilder sb = new StringBuilder(); + sb.append(String.format("%tFT% entry : parameters.entrySet()) { + sb.append(entry.getValue()).append(" "); + } + + if (sb.length() > 0) { + sb.setLength(sb.length() - 2); + } + + ctx.setAttribute("aai-summary-status-message", sb.toString()); + LOG.info("aai-summary-status-message: " + sb.toString()); + } + + /** + * Generic method to GET json data from an A&AI using key structure. + * Then convert that json to an Object. + * If successful the Object is attempted to be cast to the type parameter. + * + * @param key + * key identifying the resource to be retrieved from AAI + * @param type + * the class of object that A&AI will return + * @return the object created from json or null if the response code is not 200 + * + * @throws AAIServiceException + * if empty or null key and or type or there's an error with processing + */ + + public T getResource(String key, Class type) throws AAIServiceException { + if (StringUtils.isEmpty(key) || type == null) { + throw new AAIServiceException("Key is empty or null and or type is null"); + } + + T response = null; + + SvcLogicContext ctx = new SvcLogicContext(); + if(!key.contains(" = ")) { + if(isValidURL(key)) { + key = String.format("selflink = '%s'", key); + } else { + return response; + } + } + + HashMap nameValues = keyToHashMap(key, ctx); + + AAIRequest request = new SelfLinkRequest(type); + if(nameValues.containsKey(PathRequest.RESOURCE_PATH.replaceAll("-", "_"))) { + request = new PathRequest(type); + } + + request.processRequestPathValues(nameValues); + Object obj = this.getExecutor().query(request, type); + response = type.cast(obj); + + return response != null ? type.cast(response) : response; + } + + public boolean isValidURL(String url) { + + URL u = null; + + try { + u = new URL(url); + } catch (MalformedURLException e) { + return false; + } + + try { + u.toURI(); + } catch (URISyntaxException e) { + return false; + } + + return true; + } + + @Override + protected boolean deleteRelationshipList(URL httpReqUrl, String json_text) throws AAIServiceException { + if(httpReqUrl == null) { + throw new NullPointerException(); + } + + boolean response = false; + InputStream inputStream = null; + + try { + HttpURLConnection con = getConfiguredConnection(httpReqUrl, HttpMethod.DELETE); + +// SSLSocketFactory sockFact = CTX.getSocketFactory(); +// con.setSSLSocketFactory( sockFact ); + OutputStreamWriter osw = new OutputStreamWriter(con.getOutputStream()); + osw.write(json_text); + osw.flush(); + osw.close(); + + + LOGwriteFirstTrace("DELETE", httpReqUrl.toString()); + LOGwriteDateTrace("data", json_text); + + // Check for errors + int responseCode = con.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_NO_CONTENT) { + inputStream = con.getInputStream(); + } else { + inputStream = con.getErrorStream(); + } + + // Process the response + LOG.debug("HttpURLConnection result:" + responseCode); + if(inputStream == null) inputStream = new ByteArrayInputStream("".getBytes(StandardCharsets.UTF_8)); + BufferedReader reader = new BufferedReader( new InputStreamReader( inputStream ) ); + String line = null; + + ObjectMapper mapper = getObjectMapper(); + + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_NO_CONTENT) { + StringBuilder stringBuilder = new StringBuilder(); + + while( ( line = reader.readLine() ) != null ) { + stringBuilder.append( line ); + } + LOGwriteEndingTrace(responseCode, "SUCCESS", stringBuilder.toString()); + response = true; + } else if(responseCode == HttpURLConnection.HTTP_NOT_FOUND ) { + LOGwriteEndingTrace(responseCode, "HTTP_NOT_FOUND", "Entry does not exist."); + response = false; + } else { + ErrorResponse errorresponse = mapper.readValue(reader, ErrorResponse.class); + LOGwriteEndingTrace(responseCode, "FAILURE", mapper.writeValueAsString(errorresponse)); + throw new AAIServiceException(responseCode, errorresponse); + } + + } catch(AAIServiceException aaiexc) { + throw aaiexc; + } catch (Exception exc) { + LOG.warn("deleteRelationshipList", exc); + throw new AAIServiceException(exc); + } finally { + if(inputStream != null){ + try { + inputStream.close(); + } catch(Exception exc) { + + } + } + } + return response; + } + + public static ObjectMapper getObjectMapper() { + ObjectMapper mapper = new ObjectMapper(); + AnnotationIntrospector introspector = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance()); + AnnotationIntrospector secondary = new JacksonAnnotationIntrospector(); + mapper.setAnnotationIntrospector(AnnotationIntrospector.pair(introspector, secondary)); + mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + mapper.setSerializationInclusion(Include.NON_NULL); + return mapper; + } + + public void logMetricRequest(String requestId, String targetServiceName, String msg, String path){ + String svcInstanceId = ""; + String svcName = null; + String partnerName = null; + String targetEntity = "A&AI"; + String targetVirtualEntity = null; + + targetServiceName = ""; + + ml.logRequest(svcInstanceId, svcName, partnerName, targetEntity, targetServiceName, targetVirtualEntity, msg); + } + + public void logMetricResponse(String requestId, int responseCode, String responseDescription){ + ml.logResponse(responseCode < 400 ? "SUCCESS" : "FAILURE", Integer.toString(responseCode), responseDescription); + } + + public void logKeyError(String keys){ + LOG.error("Atleast one of the keys [" + keys + "] should have been populated. This will cause a NPE."); + } + + + /** + * Retrofit code + */ + @Override + public QueryStatus save(String resource, boolean force, boolean localOnly, String key, Map params, String prefix, SvcLogicContext ctx) + throws SvcLogicException { + String normResource = resource.split(":")[0]; + + switch(normResource){ + case "formatted-query": + case "generic-query": + case "named-query": + case "nodes-query": + case "linterface": + case "l2-bridge-sbg": + case "l2-bridge-bgf": + case "echo": + case "test": + break; + + default: + if(!key.contains(String.format("%s.", normResource))) { + key = rewriteKey(resource, key, ctx); + } + } + return super.save(resource, force, localOnly, key, params, prefix, ctx); + } + + @Override + public QueryStatus query(String resource, boolean localOnly, String select, String key, String prefix, String orderBy, SvcLogicContext ctx) + throws SvcLogicException { + String normResource = resource.split(":")[0]; + + switch(normResource){ + case "formatted-query": + case "generic-query": + case "named-query": + case "nodes-query": + case "linterface": + case "l2-bridge-sbg": + case "l2-bridge-bgf": + case "echo": + case "test": + break; + + default: + if(!key.contains(String.format("%s.", normResource))) { + key = rewriteKey(resource, key, ctx); + } + } + + return super.query(resource, localOnly, select, key, prefix, orderBy, ctx); + } + + @Override + public QueryStatus delete(String resource, String key, SvcLogicContext ctx) throws SvcLogicException { + String normResource = resource.split(":")[0]; + + switch(normResource){ + case "formatted-query": + case "generic-query": + case "named-query": + case "nodes-query": + case "linterface": + case "l2-bridge-sbg": + case "l2-bridge-bgf": + case "echo": + case "test": + break; + + default: + if(!key.contains(String.format("%s.", normResource))) { + key = rewriteKey(resource, key, ctx); + } + } + + return super.delete(resource, key, ctx); + } + + @Override + public QueryStatus update(String resource, String key, Map params, String prefix, SvcLogicContext ctx) throws SvcLogicException { + String normResource = resource.split(":")[0]; + + switch(normResource){ + case "formatted-query": + case "generic-query": + case "named-query": + case "nodes-query": + case "linterface": + case "l2-bridge-sbg": + case "l2-bridge-bgf": + case "echo": + case "test": + break; + + default: + if(!key.contains(String.format("%s.", normResource))) { + key = rewriteKey(resource, key, ctx); + } + } + + return super.update(resource, key, params, prefix, ctx); + } + + private String rewriteKey(String resource, String key, SvcLogicContext ctx) { + LOG.info("AAI Deprecation - the format of request key is no longer supported. Please rewrite this key : " + key); + + String normResource = resource.split(":")[0]; + Class clazz = null; + try { + clazz = AAIRequest.getClassFromResource(normResource) ; + } catch (ClassNotFoundException e) { + LOG.warn("AAIRequest does not support class: " + e.getMessage()); + return key; + } + if(clazz == null) + return key; + + List fieldAnnotatedNames = new LinkedList(); + + Field[] fields = clazz.getDeclaredFields(); + for(Field field : fields) { + String fieldName = field.getName(); + XmlElement annotation = field.getAnnotation(XmlElement.class); + if(annotation == null) + continue; + String primaryId = annotation.name(); + if("##default".equals(primaryId)) { + primaryId = fieldName; + } + fieldAnnotatedNames.add(primaryId); + } + + HashMap nameValues = keyToHashMap(key, ctx); + Set keyset = nameValues.keySet(); + for(String keyName : keyset) { + if(keyName.contains(".")) + continue; + else { + String tmpKeyName = keyName.replaceAll("_", "-"); + if(fieldAnnotatedNames.contains(tmpKeyName)) { + key = key.replace(tmpKeyName, String.format("%s.%s", normResource, tmpKeyName)); + } + } + } + + + return key; + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIServiceActivator.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIServiceActivator.java new file mode 100644 index 00000000..28887738 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIServiceActivator.java @@ -0,0 +1,239 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.File; +import java.io.FileInputStream; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashSet; +import java.util.Properties; +import java.util.Set; + +import org.onap.ccsdk.sli.core.sli.ConfigurationException; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AAIServiceActivator implements BundleActivator { + + private static final String DEFAULT_CONFIG_FILE_NAME = "aaiclient.config"; + private static final String DEFAULT_PROPERTY_FILE_NAME = "aaiclient.properties"; + private static final String DEFAULT_KEYWORD = "default"; + + private static final String SDNC_CONFIG_DIR = "SDNC_CONFIG_DIR"; + + private static final String BVC_PROPERTY_FILE = "/opt/bvc/controller/configuration/aaiclient.properties"; + private static final String DEFAULT_SDNC_PROPERTY_FILE = "/opt/sdnc/data/properties/aaiclient.properties"; + + private Set registrationSet = new HashSet(); + + private static final Logger LOG = LoggerFactory.getLogger(AAIServiceActivator.class); + + @Override + public void start(BundleContext ctx) throws Exception { + + System.setProperty("aaiclient.runtime", "OSGI"); + + String sdnConfigDirectory = System.getenv(SDNC_CONFIG_DIR); + + // check SDNC CONFIG DIR system property + if(sdnConfigDirectory == null ) { + LOG.error("System property SDNC_CONFIG_DIR is not defined."); + LOG.info("Defaulting SDNC_CONFIG_DIR to '/opt/sdnc/data/properties/'"); + sdnConfigDirectory = "/opt/sdnc/data/properties/"; + } + + LOG.debug("Configuration directory used : " + sdnConfigDirectory); + + // check existance of properties directory + File configDirectory = new File(sdnConfigDirectory); + if(!configDirectory.exists() || !configDirectory.isDirectory()){ + LOG.error("System property SDNC_CONFIG_DIR = '" + sdnConfigDirectory + "' does not point to a valid directory. AAIService will not be initialized."); + return; + } + + Properties properties = new Properties(); + InputStream input = null; + + // find aaiclient config file + File[] files = findFiles(configDirectory, DEFAULT_CONFIG_FILE_NAME); + + // read the aai config data + if(files != null && files.length > 0) { + LOG.debug("AAIService config file exists and it is named :" + files[0].getAbsolutePath() ); + try { + input = new FileInputStream(files[0]); + properties.load(input); + LOG.debug("Loaded AAI Client properties from " + files[0].getAbsolutePath()); + } catch (IOException exc) { + LOG.warn("Problem loading AAI Client properties from " + files[0].getAbsolutePath(), exc); + } finally { + if(input != null ) { + try { + input.close(); + } catch(Exception exc) { + // ignore + } + } + int size = properties.keySet().size() ; + if(size == 0) { + LOG.debug(files[0].getAbsolutePath() + " contained no entries. Adding the default entry"); + properties.put(DEFAULT_KEYWORD, DEFAULT_PROPERTY_FILE_NAME); + } + } + } else { + LOG.debug("No configuration entries were found. Adding the default entry"); + properties.put(DEFAULT_KEYWORD, DEFAULT_PROPERTY_FILE_NAME); + } + + Set entrySet = properties. stringPropertyNames(); + String value = null; + + // initialize AAI Service for each aai client property files + for(String entry : entrySet) { + value = properties.getProperty(entry); + if(value != null && !value.isEmpty()) { + + final String fileName = value; + + File[] propertyFileList = findFiles(configDirectory, fileName); + + for(File propertiesFile : propertyFileList) { + LOG.info(propertiesFile.getName()); + // Advertise AAI resource adaptor + AAIClient impl = null; + switch(entry) { + case DEFAULT_KEYWORD: + impl = new AAIService(propertiesFile.toURI().toURL()); + break; + case "trinity": + impl = new AAITrinityService(propertiesFile.toURI().toURL()); + break; + default: + LOG.error("Invalid configuration keyword '"+entry+"' detected in aaiclient.config. Aborting initialization"); + continue; + } + String regName = impl.getClass().getName(); + + LOG.debug("Registering AAIService service "+regName); + ServiceRegistration registration = ctx.registerService(regName, impl, null); + registrationSet.add(registration); + + } + } + } + } + +// @Override + @Deprecated + public void start1(BundleContext ctx) throws Exception { + + String sdnConfigDirectory = System.getenv(SDNC_CONFIG_DIR); + String propertiesPath = null; + + if (sdnConfigDirectory == null || sdnConfigDirectory.isEmpty()) { + String filename = DEFAULT_SDNC_PROPERTY_FILE; + File file = new File(filename); + if(file != null && file.exists()) { + propertiesPath = filename; + LOG.info("Using property file (1): " + propertiesPath); + } else { + filename = BVC_PROPERTY_FILE; + file = new File(filename); + if(file != null && file.exists()) { + propertiesPath = filename; + LOG.info("Using property file (1): " + propertiesPath); + } else { + throw new ConfigurationException("Cannot find config file - "+filename+" and "+SDNC_CONFIG_DIR+" is unset"); + } + } + } else { + propertiesPath = sdnConfigDirectory + "/aaiclient.properties"; + LOG.info("Environment variable " + SDNC_CONFIG_DIR + " set, - calculated path " + propertiesPath); + } + + File propFile = new File(propertiesPath); + if(!propFile.exists()) { + String filename = DEFAULT_SDNC_PROPERTY_FILE; + File file = new File(filename); + if(file != null && file.exists()) { + propertiesPath = filename; + LOG.info("Using property file (1): " + propertiesPath); + } else { + filename = BVC_PROPERTY_FILE; + file = new File(filename); + if(file != null && file.exists()) { + propertiesPath = filename; + LOG.info("Using property file (1): " + propertiesPath); + } else { + LOG.error("AnAI Service Property file " + propertiesPath + "does not exist."); + throw new ConfigurationException("Cannot find config file - "+propertiesPath+" and " + SDNC_CONFIG_DIR + " is unset."); + } + } + } + + // Advertise AAI resource adaptor + AAIClient impl = new AAIService(propFile.toURI().toURL()); + String regName = impl.getClass().getName(); + + LOG.debug("Registering AAIService service "+regName); + ServiceRegistration registration = ctx.registerService(regName, impl, null); + registrationSet.add(registration); + } + + @Override + public void stop(BundleContext ctx) throws Exception { + + Set localRegistrationSet = new HashSet(); + localRegistrationSet.addAll(registrationSet); + + for(ServiceRegistration registration : localRegistrationSet) { + if (registration != null) { + try { + AAIService aaiService = (AAIService)ctx.getService(registration.getReference()); + registration.unregister(); + registrationSet.remove(registration); + if(aaiService != null) { + aaiService.cleanUp(); + } + } catch(Exception exc) { + if(LOG.isDebugEnabled()) + LOG.debug(exc.getMessage()); + } + } + } + } + + private File[] findFiles(File configDirectory, final String filter) { + File[] files = configDirectory.listFiles(new FilenameFilter() { + public boolean accept(File dir, String name) { + return name.equalsIgnoreCase(filter); + } + }); + + return files; + } +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIServiceException.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIServiceException.java new file mode 100644 index 00000000..cda60a8c --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAIServiceException.java @@ -0,0 +1,77 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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 org.openecomp.sdnc.sli.aai.data.ErrorResponse; + +public class AAIServiceException extends Exception { + + /** + * + */ + private static final long serialVersionUID = -9039257722542999522L; + + protected ErrorResponse errorResponse = null; + protected int returnCode = -1; + + public AAIServiceException() { + + } + + public AAIServiceException(String message) { + super(message); + } + + public AAIServiceException(Throwable cause) { + super(cause); + } + + public AAIServiceException(String message, Throwable cause) { + super(message, cause); + } + + public AAIServiceException(String message, Throwable cause, + boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public AAIServiceException(int returnCode, ErrorResponse errorresponse) { + this.errorResponse = errorresponse; + this.returnCode = returnCode; + } + + 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/openecomp/sdnc/sli/aai/AAITrinityService.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAITrinityService.java new file mode 100644 index 00000000..ed5295cf --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/AAITrinityService.java @@ -0,0 +1,38 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.net.URL; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AAITrinityService extends AAIService { + + private static final Logger LOG = LoggerFactory.getLogger(AAITrinityService.class); + + public AAITrinityService(URL propURL) { + super(propURL); + LOG.info("Entered AAITrinityService.ctor"); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/CloudRegionRequest.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/CloudRegionRequest.java new file mode 100644 index 00000000..08c86a27 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/CloudRegionRequest.java @@ -0,0 +1,135 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.net.MalformedURLException; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.openecomp.aai.inventory.v10.CloudRegion; +import org.openecomp.sdnc.sli.aai.data.AAIDatum; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.Joiner; + +public class CloudRegionRequest extends AAIRequest { + + public static final String CLOUD_REGION_PATH = "org.openecomp.sdnc.sli.aai.path.cloud.region"; + + private final String cloud_region_path; + + public static final String CLOUD_REGION_CLOUD_OWNER = "cloud-region.cloud-owner"; + public static final String CLOUD_REGION_CLOUD_REGION_ID = "cloud-region.cloud-region-id"; + + + public CloudRegionRequest() { + cloud_region_path = configProperties.getProperty(CLOUD_REGION_PATH); + } + + @Override + public URL getRequestQueryUrl(String method) throws UnsupportedEncodingException, MalformedURLException { + return this.getRequestUrl(method, null); + } + + @Override + public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = target_uri+cloud_region_path; + + request_url = processPathData(request_url, requestProperties); + + Map query = new HashMap(); + if(requestProperties.containsKey(DEPTH)) { + query.put(DEPTH, requestProperties.getProperty(DEPTH)); + } + + if(resourceVersion != null) { +// request_url = request_url +"?resource-version="+resourceVersion; + query.put(RESOURCE_VERSION, resourceVersion); + } + + if(!query.isEmpty()) { + Joiner.MapJoiner mapJoiner = Joiner.on("&").withKeyValueSeparator("="); + String queryString = mapJoiner.join(query); + request_url = String.format("%s?%s", request_url, queryString); + } + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + + return http_req_url; + } + + + @Override + public String toJSONString() { + ObjectMapper mapper = getObjectMapper(); + CloudRegion vnfc = (CloudRegion)requestDatum; + String json_text = null; + try { + json_text = mapper.writeValueAsString(vnfc); + } catch (JsonProcessingException exc) { + handleException(this, exc); + return null; + } + return json_text; + } + + @Override + public String[] getArgsList() { + String[] args = + { + CLOUD_REGION_CLOUD_OWNER, + CLOUD_REGION_CLOUD_REGION_ID, + DEPTH + }; + + return args; + } + + @Override + public Class getModelClass() { + return CloudRegion.class; + } + + public static String processPathData(String request_url, Properties requestProperties) throws UnsupportedEncodingException { + + if(!requestProperties.containsKey(CLOUD_REGION_CLOUD_OWNER) || !requestProperties.containsKey(CLOUD_REGION_CLOUD_REGION_ID)) { + aaiService.logKeyError(String.format("%s,%s", CLOUD_REGION_CLOUD_OWNER, CLOUD_REGION_CLOUD_REGION_ID)); + } + + String encoded_vnf = encodeQuery(requestProperties.getProperty(CLOUD_REGION_CLOUD_OWNER)); + request_url = request_url.replace("{cloud-owner}", encoded_vnf) ; + + encoded_vnf = encodeQuery(requestProperties.getProperty(CLOUD_REGION_CLOUD_REGION_ID)); + request_url = request_url.replace("{cloud-region-id}", encoded_vnf) ; + + aaiService.LOGwriteDateTrace("cloud-owner", requestProperties.getProperty(CLOUD_REGION_CLOUD_OWNER)); + aaiService.LOGwriteDateTrace("cloud-region-id", requestProperties.getProperty(CLOUD_REGION_CLOUD_REGION_ID)); + + return request_url; + } +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/CustomQueryRequest.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/CustomQueryRequest.java new file mode 100644 index 00000000..d61a4ea8 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/CustomQueryRequest.java @@ -0,0 +1,134 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.IOException; +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Properties; + +import org.openecomp.sdnc.sli.aai.data.AAIDatum; +import org.openecomp.sdnc.sli.aai.query.FormattedQueryRequestData; +import org.openecomp.sdnc.sli.aai.query.FormattedQueryResultList; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + + +public class CustomQueryRequest extends AAIRequest { + + public static final String GENERIC_SEARCH_PATH = "org.openecomp.sdnc.sli.aai.query.generic"; + + private final String generic_search_path; + + public static final String FORMAT = "format"; + + + public CustomQueryRequest() { + String tmp_generic_search_path = configProperties.getProperty(GENERIC_SEARCH_PATH); + tmp_generic_search_path = tmp_generic_search_path.split("search")[0]; + generic_search_path = tmp_generic_search_path +"query"; + } + + + @Override + public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = target_uri+generic_search_path; + + request_url = processPathData(request_url, requestProperties); + + String formatQuery = requestProperties.getProperty(FORMAT); + + if(formatQuery != null) { + request_url = request_url +"?format="+formatQuery; + } + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + + return http_req_url; + } + + @Override + public URL getRequestQueryUrl(String method) throws UnsupportedEncodingException, MalformedURLException { + return getRequestUrl(method, null); + } + + + @Override + public String toJSONString() { + ObjectMapper mapper = getObjectMapper(); + FormattedQueryRequestData tenant = (FormattedQueryRequestData)requestDatum; + String json_text = null; + try { + json_text = mapper.writeValueAsString(tenant); + } catch (JsonProcessingException exc) { + handleException(this, exc); + return null; + } + return json_text; + } + + + @Override + public String[] getArgsList() { + String[] args = {FORMAT}; + return args; + } + + + @Override + public Class getModelClass() { + return FormattedQueryRequestData.class; + } + + + public static String processPathData(String request_url, Properties requestProperties) throws UnsupportedEncodingException { + + String key = FORMAT; + + String encoded_vnf = encodeQuery(requestProperties.getProperty(key)); + request_url = request_url.replace("{identifier}", encoded_vnf) ; + aaiService.LOGwriteDateTrace("identifier", requestProperties.getProperty(key)); + + return request_url; + } + + public AAIDatum jsonStringToObject(String jsonData) throws JsonParseException, JsonMappingException, IOException { + if(jsonData == null) { + return null; + } + + AAIDatum response = null; + ObjectMapper mapper = getObjectMapper(); + response = mapper.readValue(jsonData, FormattedQueryResultList.class); + return response; + } + + protected boolean expectsDataFromPUTRequest() { + return true; + } +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/EchoRequest.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/EchoRequest.java new file mode 100644 index 00000000..7352c402 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/EchoRequest.java @@ -0,0 +1,93 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.net.MalformedURLException; +import java.net.URL; + +import org.openecomp.sdnc.sli.aai.data.AAIDatum; +import org.openecomp.sdnc.sli.aai.data.EchoResponse; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class EchoRequest extends AAIRequest { + + + + private final String echo_path; + + public EchoRequest() { + echo_path = "/aai/util/echo"; + } + + + @Override + public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = target_uri+echo_path; + + if(resourceVersion != null) { + request_url = request_url +"?resource-version="+resourceVersion; + } + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + + return http_req_url; + } + + @Override + public URL getRequestQueryUrl(String method) throws UnsupportedEncodingException, MalformedURLException { + return getRequestUrl(method, null); + } + + + @Override + public String toJSONString() { + ObjectMapper mapper = getObjectMapper(); + EchoResponse tenant = (EchoResponse)requestDatum; + String json_text = null; + try { + json_text = mapper.writeValueAsString(tenant); + } catch (JsonProcessingException exc) { + handleException(this, exc); + return null; + } + return json_text; + } + + + @Override + public String[] getArgsList() { + String[] args = {}; + return args; + } + + + @Override + public Class getModelClass() { + return EchoResponse.class; + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/GenericQueryRequest.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/GenericQueryRequest.java new file mode 100644 index 00000000..0f1dda0e --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/GenericQueryRequest.java @@ -0,0 +1,144 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.net.MalformedURLException; +import java.net.URL; +import java.util.Properties; + +import org.openecomp.aai.inventory.v10.ResultData; +import org.openecomp.sdnc.sli.aai.data.AAIDatum; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class GenericQueryRequest extends AAIRequest { + + public static final String GENERIC_SEARCH_PATH = "org.openecomp.sdnc.sli.aai.query.generic"; + + private final String generic_search_path; + + public static final String START_NODE_TYPE = "start-node-type"; + public static final String IDENTIFIER = "identifier"; + public static final String VALUE = "value"; + + + public GenericQueryRequest() { + generic_search_path = configProperties.getProperty(GENERIC_SEARCH_PATH); + } + + +// @Override +// public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { +// +// String request_url = target_uri+generic_search_path; +// String key = START_NODE_TYPE; +// +// String encoded_vnf = encodeQuery(requestProperties.getProperty(key)); +// request_url = request_url.replace("{vnf-id}", encoded_vnf) ; +// +// if(resourceVersion != null) { +// request_url = request_url +"?resource-version="+resourceVersion; +// } +// URL http_req_url = new URL(request_url); +// +// aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); +// +// +// return http_req_url; +// } + + @Override + public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = target_uri+generic_search_path; + + request_url = processPathData(request_url, requestProperties); + + if(resourceVersion != null) { + request_url = request_url +"?resource-version="+resourceVersion; + } + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + + return http_req_url; + } + + @Override + public URL getRequestQueryUrl(String method) throws UnsupportedEncodingException, MalformedURLException { + return getRequestUrl(method, null); + } + + + @Override + public String toJSONString() { + ObjectMapper mapper = getObjectMapper(); + ResultData tenant = (ResultData)requestDatum; + String json_text = null; + try { + json_text = mapper.writeValueAsString(tenant); + } catch (JsonProcessingException exc) { + handleException(this, exc); + return null; + } + return json_text; + } + + + @Override + public String[] getArgsList() { + String[] args = {START_NODE_TYPE, IDENTIFIER, VALUE}; + return args; + } + + + @Override + public Class getModelClass() { + return ResultData.class; + } + + + public static String processPathData(String request_url, Properties requestProperties) throws UnsupportedEncodingException { + + String key = IDENTIFIER; + + String encoded_vnf = encodeQuery(requestProperties.getProperty(key)); + request_url = request_url.replace("{identifier}", encoded_vnf) ; + aaiService.LOGwriteDateTrace("identifier", requestProperties.getProperty(key)); + + key = VALUE; + + encoded_vnf = encodeQuery(requestProperties.getProperty(key)); + request_url = request_url.replace("{value}", encoded_vnf) ; + aaiService.LOGwriteDateTrace("value", requestProperties.getProperty(key)); + + key = START_NODE_TYPE; + + encoded_vnf = encodeQuery(requestProperties.getProperty(key)); + request_url = request_url.replace("{start-node-type}", encoded_vnf) ; + aaiService.LOGwriteDateTrace("start-node-type", requestProperties.getProperty(key)); + + return request_url; + } +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/GenericRequest.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/GenericRequest.java new file mode 100644 index 00000000..0da40abe --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/GenericRequest.java @@ -0,0 +1,319 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.reflect.Field; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import javax.xml.bind.annotation.XmlElement; + +import org.openecomp.aai.inventory.v10.L3Network; +import org.openecomp.aai.inventory.v10.L3Networks; +import org.openecomp.sdnc.sli.aai.data.AAIDatum; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.Joiner; + +public class GenericRequest extends AAIRequest { + + + protected Class model; + + public GenericRequest(Class clazz) { + model = clazz; + } + + @Override + public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = null; + String originalPath = null; + String pathSubstitute = null; + + request_url = target_uri + getRequestPath(); + + Map queryParams = new HashMap (); + if(resourceVersion != null) { + queryParams.put("resource-version",resourceVersion); + } + + Set uniqueResources = extractUniqueResourceSetFromKeys(requestProperties.stringPropertyNames()); + + String[] keys = requestProperties.keySet().toArray(new String[0]); + for(String key : keys) { + if("cloud-region.cloud-region-id".equals(key)) + continue; + if("entitlement.resource-uuid".equals(key)) + continue; + if("license.resource-uuid".equals(key)) + continue; + + + String value = requestProperties.getProperty(key); + if(key.contains(".")) { + String[] splitKey = key.split("\\."); + if("cloud-region".equals(splitKey[0])){ + String cloudRegionId = requestProperties.getProperty("cloud-region.cloud-region-id"); + aaiService.LOGwriteDateTrace("cloud-region-id", cloudRegionId); + String token = String.format("%s/{%s}/{cloud-region-id}", splitKey[0], splitKey[1] ); + String encoded_owner = encodeQuery(value); + String encoded_region = encodeQuery(cloudRegionId); + request_url = request_url.replace(token, String.format("%s/%s/%s", splitKey[0], encoded_owner, encoded_region)); + } else if("entitlement".equals(splitKey[0])){ + String cloudRegionId = requestProperties.getProperty("entitlement.resource-uuid"); + aaiService.LOGwriteDateTrace("resource-uuid", cloudRegionId); + String token = String.format("%s/{%s}/{resource-uuid}", splitKey[0], splitKey[1] ); + String encoded_owner = encodeQuery(value); + String encoded_region = encodeQuery(cloudRegionId); + request_url = request_url.replace(token, String.format("%s/%s/%s", splitKey[0], encoded_owner, encoded_region)); + } else if("license".equals(splitKey[0])){ + String cloudRegionId = requestProperties.getProperty("license.resource-uuid"); + aaiService.LOGwriteDateTrace("resource-uuid", cloudRegionId); + String token = String.format("%s/{%s}/{resource-uuid}", splitKey[0], splitKey[1] ); + String encoded_owner = encodeQuery(value); + String encoded_region = encodeQuery(cloudRegionId); + request_url = request_url.replace(token, String.format("%s/%s/%s", splitKey[0], encoded_owner, encoded_region)); + } else { + Class clazz = null; + try { + clazz = getClassFromResource(splitKey[0]); + } catch (ClassNotFoundException exc) { + LOG.warn("AAIRequest does not support class: " + exc.getMessage()); + return null; + } + + if(clazz != null) { + if(clazz == this.model) { + Field[] fields = this.model.getDeclaredFields(); + Field field = fields[0]; + String fieldName = field.getName(); + XmlElement annotation = field.getAnnotation(XmlElement.class); + String primaryId = annotation.name(); + if("##default".equals(primaryId)) { + primaryId = fieldName; + } + + String token = String.format("%s/{%s}", splitKey[0], primaryId); + + if(splitKey[1].equals(primaryId)) { + String encoded_vnf = encodeQuery(value); + request_url = request_url.replace(token, String.format("%s/%s", splitKey[0], encoded_vnf)); + } else { + queryParams.put(splitKey[1], encodeQuery(value)); + originalPath = token; + pathSubstitute = String.format("%s", splitKey[0]); + } + } else if(L3Networks.class == this.model) { + Field[] fields = L3Network.class.getDeclaredFields(); + Field field = fields[0]; + String fieldName = field.getName(); + XmlElement annotation = field.getAnnotation(XmlElement.class); + String primaryId = annotation.name(); + if("##default".equals(primaryId)) { + primaryId = fieldName; + } + + String token = String.format("%s/{%s}", splitKey[0], primaryId); + originalPath = token; + pathSubstitute = String.format(""); + + queryParams.put(splitKey[1], encodeQuery(value)); + } else { + String token = String.format("%s/{%s}", splitKey[0], splitKey[1]); + String encoded_vnf = encodeQuery(value); + request_url = request_url.replace(token, String.format("%s/%s", splitKey[0], encoded_vnf)); + } + } + + } + aaiService.LOGwriteDateTrace(splitKey[1], value); + } + } + + if(originalPath != null && pathSubstitute != null) + request_url = request_url.replace(originalPath, pathSubstitute); + + if(!queryParams.isEmpty()) { + Joiner.MapJoiner mapJoiner = Joiner.on("&").withKeyValueSeparator("="); + String queryString = mapJoiner.join(queryParams); + request_url = String.format("%s?%s", request_url, queryString); + } + + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + + + return http_req_url; + } + + + public URL OriginalgetRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = null; + + request_url = target_uri + getRequestPath(); + + Map keyValuepairs = new HashMap (); + Set uniqueResources = extractUniqueResourceSetFromKeys(requestProperties.stringPropertyNames()); + + String[] keys = requestProperties.keySet().toArray(new String[0]); + for(String key : keys) { + if("cloud-region.cloud-region-id".equals(key)) + continue; + if("entitlement.resource-uuid".equals(key)) + continue; + if("license.resource-uuid".equals(key)) + continue; + + + String value = requestProperties.getProperty(key); + if(key.contains(".")) { + String[] splitKey = key.split("\\."); + if("cloud-region".equals(splitKey[0])){ + String cloudRegionId = requestProperties.getProperty("cloud-region.cloud-region-id"); + aaiService.LOGwriteDateTrace("cloud-region-id", cloudRegionId); + String token = String.format("%s/{%s}/{cloud-region-id}", splitKey[0], splitKey[1] ); + String encoded_owner = encodeQuery(value); + String encoded_region = encodeQuery(cloudRegionId); + request_url = request_url.replace(token, String.format("%s/%s/%s", splitKey[0], encoded_owner, encoded_region)); + } else if("entitlement".equals(splitKey[0])){ + String cloudRegionId = requestProperties.getProperty("entitlement.resource-uuid"); + aaiService.LOGwriteDateTrace("resource-uuid", cloudRegionId); + String token = String.format("%s/{%s}/{resource-uuid}", splitKey[0], splitKey[1] ); + String encoded_owner = encodeQuery(value); + String encoded_region = encodeQuery(cloudRegionId); + request_url = request_url.replace(token, String.format("%s/%s/%s", splitKey[0], encoded_owner, encoded_region)); + } else if("license".equals(splitKey[0])){ + String cloudRegionId = requestProperties.getProperty("license.resource-uuid"); + aaiService.LOGwriteDateTrace("resource-uuid", cloudRegionId); + String token = String.format("%s/{%s}/{resource-uuid}", splitKey[0], splitKey[1] ); + String encoded_owner = encodeQuery(value); + String encoded_region = encodeQuery(cloudRegionId); + request_url = request_url.replace(token, String.format("%s/%s/%s", splitKey[0], encoded_owner, encoded_region)); + } else { + Class clazz = null; + try { + clazz = getClassFromResource(splitKey[0]); + } catch (ClassNotFoundException exc) { + LOG.warn("AAIRequest does not support class: " + exc.getMessage()); + return null; + } + + if(clazz != null) { + if(clazz == this.model) { + Field[] fields = this.model.getDeclaredFields(); + Field field = fields[0]; + String fieldName = field.getName(); + XmlElement annotation = field.getAnnotation(XmlElement.class); + String primaryId = annotation.name(); + if("##default".equals(primaryId)) { + primaryId = fieldName; + } + + String token = String.format("%s/{%s}", splitKey[0], primaryId); + + if(splitKey[1].equals(primaryId)) { + String encoded_vnf = encodeQuery(value); + request_url = request_url.replace(token, String.format("%s/%s", splitKey[0], encoded_vnf)); + } else { + String replacement = String.format("%s?%s=%s", splitKey[0], splitKey[1], encodeQuery(value)); + if(request_url.contains(token)) + request_url = request_url.replace(token, replacement); + } + } else { + String token = String.format("%s/{%s}", splitKey[0], splitKey[1]); + String encoded_vnf = encodeQuery(value); + request_url = request_url.replace(token, String.format("%s/%s", splitKey[0], encoded_vnf)); + } + } + + } + aaiService.LOGwriteDateTrace(splitKey[1], value); + } + } + + + if(resourceVersion != null) { + request_url = request_url +"?resource-version="+resourceVersion; + } + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + + + return http_req_url; + } + + @Override + public URL getRequestQueryUrl(String method) throws UnsupportedEncodingException, MalformedURLException { + return this.getRequestUrl(method, null); + } + + + @Override + public String toJSONString() { + ObjectMapper mapper = getObjectMapper(); + + String json_text = null; + try { + json_text = mapper.writeValueAsString(requestDatum); + } catch (JsonProcessingException exc) { + handleException(this, exc); + return null; + } + return json_text; + } + + @Override + public String[] getArgsList() { + String[] args = {}; + return args; + } + + @Override + public Class getModelClass() { + return model; + } + + public void processRequestPathValues(Map nameValues) { + // identify unique resources + Set uniqueResources = AAIRequest.extractUniqueResourceSetFromKeys(nameValues.keySet()); + + String[] arguments = nameValues.keySet().toArray(new String[0]); + for(String name : arguments) { + String tmpName = name.replaceAll("-", "_"); + String value = nameValues.get(tmpName); + if(value != null && !value.isEmpty()) { + value = value.trim().replace("'", "").replace("$", "").replace("'", ""); + tmpName = name.replaceAll("_", "-"); + this.addRequestProperty(tmpName, value); + } + } + } +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/GenericVnfRequest.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/GenericVnfRequest.java new file mode 100644 index 00000000..f8c9a18b --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/GenericVnfRequest.java @@ -0,0 +1,144 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.net.MalformedURLException; +import java.net.URL; +import java.util.Properties; + +import org.openecomp.aai.inventory.v10.GenericVnf; +import org.openecomp.sdnc.sli.aai.data.AAIDatum; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class GenericVnfRequest extends AAIRequest { + + // tenant (1602) + public static final String GENERIC_VNF_PATH = "org.openecomp.sdnc.sli.aai.path.generic.vnf"; + public static final String GENERIC_VNF_QUERY_PATH = "org.openecomp.sdnc.sli.aai.path.generic.vnf.query"; + + private final String generic_vnf_path; + private final String generic_vnf_query_path; + + public static final String GENERIC_VNF_ID = "generic_vnf.vnf_id"; + public static final String VNF_ID = "vnf_id"; + + + public GenericVnfRequest() { + generic_vnf_path = configProperties.getProperty(GENERIC_VNF_PATH); + generic_vnf_query_path = configProperties.getProperty(GENERIC_VNF_QUERY_PATH); + } + + + @Override + public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = target_uri+generic_vnf_path; + String key = VNF_ID; + if(requestProperties.containsKey(GENERIC_VNF_ID)) { + key = GENERIC_VNF_ID; + } + + if(!requestProperties.containsKey(key)) { + aaiService.logKeyError(String.format("%s,%s", VNF_ID, GENERIC_VNF_ID)); + } + + String encoded_vnf = encodeQuery(requestProperties.getProperty(key)); + request_url = request_url.replace("{vnf-id}", encoded_vnf) ; + if(resourceVersion != null) { + request_url = request_url +"?resource-version="+resourceVersion; + } + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + aaiService.LOGwriteDateTrace("vnf-id", requestProperties.getProperty(key)); + + return http_req_url; + } + + @Override + public URL getRequestQueryUrl(String method) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = target_uri+generic_vnf_path; + + String key = VNF_ID; + if(requestProperties.containsKey(GENERIC_VNF_ID)) { + key = GENERIC_VNF_ID; + } + + if(!requestProperties.containsKey(key)) { + aaiService.logKeyError(String.format("%s,%s", VNF_ID, GENERIC_VNF_ID)); + } + + String encoded_vnf = encodeQuery(requestProperties.getProperty(key)); + request_url = request_url.replace("{vnf-id}", encoded_vnf) ; + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + aaiService.LOGwriteDateTrace("vnf-id", requestProperties.getProperty(key)); + + return http_req_url; + } + + + @Override + public String toJSONString() { + ObjectMapper mapper = getObjectMapper(); + GenericVnf tenant = (GenericVnf)requestDatum; + String json_text = null; + try { + json_text = mapper.writeValueAsString(tenant); + } catch (JsonProcessingException exc) { + handleException(this, exc); + return null; + } + return json_text; + } + + + @Override + public String[] getArgsList() { + String[] args = {VNF_ID, GENERIC_VNF_ID}; + return args; + } + + + @Override + public Class getModelClass() { + return GenericVnf.class; + } + + + public static String processPathData(String request_url, Properties requestProperties) throws UnsupportedEncodingException { + + String key = VNF_ID; + if(requestProperties.containsKey(GENERIC_VNF_ID)) { + key = GENERIC_VNF_ID; + } + String encoded_vnf = encodeQuery(requestProperties.getProperty(key)); + request_url = request_url.replace("{vnf-id}", encoded_vnf) ; + + return request_url; + } +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/L3InterfaceIpv4AddressListRequest.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/L3InterfaceIpv4AddressListRequest.java new file mode 100644 index 00000000..762d43bb --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/L3InterfaceIpv4AddressListRequest.java @@ -0,0 +1,212 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.net.MalformedURLException; +import java.net.URL; +import java.util.Properties; + +import org.openecomp.aai.inventory.v10.L3InterfaceIpv4AddressList; +import org.openecomp.sdnc.sli.aai.data.AAIDatum; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class L3InterfaceIpv4AddressListRequest extends AAIRequest { + + /* + * Note: there are 3 possible paths: + * /aai/v7/network/generic-vnfs/generic-vnf/{vnf-id}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + * /aai/v7/network/generic-vnfs/generic-vnf/{vnf-id}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + * /aai/v7/network/generic-vnfs/generic-vnf/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + * /aai/v7/network/generic-vnfs/generic-vnf/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + * aaiv7:inventory/network/newvces/newvce/{vnf-id2}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + * aaiv7:inventory/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/tenants/tenant/{tenant-id}/vservers/vserver/{vserver-id}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + * aaiv7:inventory/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/tenants/tenant/{tenant-id}/vservers/vserver/{vserver-id}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + * aaiv7:inventory/cloud-infrastructure/cloud-regions/pservers/pserver/{hostname}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + * aaiv7:inventory/cloud-infrastructure/cloud-regions/pservers/pserver/{hostname}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + * aaiv7:inventory/cloud-infrastructure/cloud-regions/pservers/pserver/{hostname}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + * aaiv7:inventory/cloud-infrastructure/cloud-regions/pservers/pserver/{hostname}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + * aaiv7:inventory/network/newvces/newvce/{vnf-id2}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + * aaiv7:inventory/network/vpes/vpe/{vnf-id}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + * aaiv7:inventory/network/vpes/vpe/{vnf-id}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + * aaiv7:inventory/network/vpes/vpe/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + * aaiv7:inventory/network/vpes/vpe/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + * aaiv7:inventory/network/vpls-pes/vpls-pe/{equipment-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + * aaiv7:inventory/network/vpls-pes/vpls-pe/{equipment-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + * aaiv7:inventory/network/vpls-pes/vpls-pe/{equipment-name}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + * aaiv7:inventory/network/vpls-pes/vpls-pe/{equipment-name}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + * aaiv7:inventory/network/pnfs/pnf/{pnf-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + * aaiv7:inventory/network/pnfs/pnf/{pnf-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + */ + + public static final String L3_INTERFACE_IPV4_ADDRESS_LIST_PATH = "org.openecomp.sdnc.sli.aai.path.l3.interface.ipv4.address.list"; + public static final String VLAN_L3_INTERFACE_IPV4_ADDRESS_LIST_PATH = "org.openecomp.sdnc.sli.aai.path.vlan.l3.interface.ipv4.address.list"; + + private final String l3_interface_ipv4_address_list_path; + private final String vlan_l3_interface_ipv4_address_list_path; + + public static final String L3_INTERFACE_IPV4_ADDRESS = "l3-interface-ipv4-address"; + public static final String LIST_L3_INTERFACE_IPV4_ADDRESS = "l3-interface-ipv4-address-list.l3-interface-ipv4-address"; + public static final String VLAN_INTERFACE = "vlan-interface"; + public static final String VLAN_VLAN_INTERFACE = "vlan.vlan-interface"; + + public L3InterfaceIpv4AddressListRequest() { + l3_interface_ipv4_address_list_path = configProperties.getProperty(L3_INTERFACE_IPV4_ADDRESS_LIST_PATH); + vlan_l3_interface_ipv4_address_list_path = configProperties.getProperty(VLAN_L3_INTERFACE_IPV4_ADDRESS_LIST_PATH); + } + + @Override + public URL getRequestQueryUrl(String method) throws UnsupportedEncodingException, MalformedURLException { + return this.getRequestUrl(method, null); + } + + @Override + public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = target_uri+l3_interface_ipv4_address_list_path; + + if(requestProperties.containsKey(VLAN_INTERFACE) || requestProperties.containsKey(VLAN_VLAN_INTERFACE)){ + request_url = target_uri+vlan_l3_interface_ipv4_address_list_path; + request_url = processVLanRequestPathData(request_url, requestProperties); + } + + request_url = processPathData(request_url, requestProperties); + request_url = LInterfaceRequest.processPathData(request_url, requestProperties); +// request_url = GenericVnfRequest.processPathData(request_url, requestProperties); + + if(resourceVersion != null) { + request_url = request_url +"?resource-version="+resourceVersion; + } + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + + return http_req_url; + } + + public static String processVLanRequestPathData(String request_url, Properties requestProperties) throws UnsupportedEncodingException { + String key = null; + + if(requestProperties.containsKey(VLAN_VLAN_INTERFACE)) { + key = VLAN_VLAN_INTERFACE; + } else if(requestProperties.containsKey(VLAN_INTERFACE)) { + key = VLAN_INTERFACE; + } else { + aaiService.logKeyError(String.format("%s,%s", VLAN_INTERFACE, VLAN_VLAN_INTERFACE)); + } + + String encoded_vnf = encodeQuery(requestProperties.getProperty(key)); + + request_url = request_url.replace("{vlan-interface}", encoded_vnf) ; + aaiService.LOGwriteDateTrace("vlan-interface", requestProperties.getProperty(key)); + return request_url; + } + + @Override + public String toJSONString() { + ObjectMapper mapper = getObjectMapper(); + L3InterfaceIpv4AddressList vnfc = (L3InterfaceIpv4AddressList)requestDatum; + String json_text = null; + try { + json_text = mapper.writeValueAsString(vnfc); + } catch (JsonProcessingException exc) { + handleException(this, exc); + return null; + } + return json_text; + } + + @Override + public String[] getArgsList() { + String[] args = + { + L3_INTERFACE_IPV4_ADDRESS, + LIST_L3_INTERFACE_IPV4_ADDRESS, + VLAN_INTERFACE, + VLAN_VLAN_INTERFACE, + LInterfaceRequest.INTERFACE_NAME, + LInterfaceRequest.LINTERFACE_INTERFACE_NAME, + "generic-vnf.vnf-id" + }; + + return args; + } + + @Override + public Class getModelClass() { + return L3InterfaceIpv4AddressList.class; + } + + public static String processPathData(String request_url, Properties requestProperties) throws UnsupportedEncodingException { + String key = L3_INTERFACE_IPV4_ADDRESS; + if(requestProperties.containsKey(LIST_L3_INTERFACE_IPV4_ADDRESS)) { + key = LIST_L3_INTERFACE_IPV4_ADDRESS; + } + + if(!requestProperties.containsKey(key)) { + aaiService.logKeyError(String.format("%s,%s", L3_INTERFACE_IPV4_ADDRESS, LIST_L3_INTERFACE_IPV4_ADDRESS)); + } + + String encoded_vnf = encodeQuery(requestProperties.getProperty(key)); + + request_url = request_url.replace("{l3-interface-ipv4-address}", encoded_vnf) ; + + aaiService.LOGwriteDateTrace("l3-interface-ipv4-address", requestProperties.getProperty(key)); + return request_url; + } + + /* + * (non-Javadoc) + * @see org.openecomp.sdnc.sli.aai.PathConfigurator#configurePath(java.lang.String) + */ +// @Override +// public void processRequestPathValues(Map nameValues) { +// String[] paths = +// { +// "/aai/v7/network/generic-vnfs/generic-vnf/{vnf-id}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address}", +// "/aai/v7/network/generic-vnfs/generic-vnf/{vnf-id}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address}", +// "/aai/v7/network/generic-vnfs/generic-vnf/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address}", +// "/aai/v7/network/generic-vnfs/generic-vnf/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address}" +// }; +// +// Listkeys = new LinkedList(); +// keys.addAll(nameValues.keySet()); +// for(String key : keys) { +// if(key.contains(".")) { +// key = key.replaceAll("_", "-"); +// if(!LIST_L3_INTERFACE_IPV4_ADDRESS.equals(key)) { +// int index = key.indexOf("."); +// String resource = key.substring(0, index); +// AAIRequest rx = createRequest(resource, nameValues); +// if(rx != null) { +// pathElements.add(rx); +// } +// } +// } +// } +// super.processRequestPathValues(nameValues); +// } +// List pathElements = new LinkedList(); + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/L3InterfaceIpv6AddressListRequest.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/L3InterfaceIpv6AddressListRequest.java new file mode 100644 index 00000000..b87f4079 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/L3InterfaceIpv6AddressListRequest.java @@ -0,0 +1,179 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.net.MalformedURLException; +import java.net.URL; +import java.util.Properties; + +import org.openecomp.aai.inventory.v10.L3InterfaceIpv6AddressList; +import org.openecomp.sdnc.sli.aai.data.AAIDatum; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class L3InterfaceIpv6AddressListRequest extends AAIRequest { + + /* + * Note: there are 3 possible paths: + * /aai/v7/network/generic-vnfs/generic-vnf/{vnf-id}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + * /aai/v7/network/generic-vnfs/generic-vnf/{vnf-id}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + * /aai/v7/network/generic-vnfs/generic-vnf/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + * /aai/v7/network/generic-vnfs/generic-vnf/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + * aaiv7:inventory/network/newvces/newvce/{vnf-id2}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + * aaiv7:inventory/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/tenants/tenant/{tenant-id}/vservers/vserver/{vserver-id}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + * aaiv7:inventory/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/tenants/tenant/{tenant-id}/vservers/vserver/{vserver-id}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + * aaiv7:inventory/cloud-infrastructure/cloud-regions/pservers/pserver/{hostname}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + * aaiv7:inventory/cloud-infrastructure/cloud-regions/pservers/pserver/{hostname}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + * aaiv7:inventory/cloud-infrastructure/cloud-regions/pservers/pserver/{hostname}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + * aaiv7:inventory/cloud-infrastructure/cloud-regions/pservers/pserver/{hostname}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + * aaiv7:inventory/network/newvces/newvce/{vnf-id2}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + * aaiv7:inventory/network/vpes/vpe/{vnf-id}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + * aaiv7:inventory/network/vpes/vpe/{vnf-id}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + * aaiv7:inventory/network/vpes/vpe/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + * aaiv7:inventory/network/vpes/vpe/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + * aaiv7:inventory/network/vpls-pes/vpls-pe/{equipment-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + * aaiv7:inventory/network/vpls-pes/vpls-pe/{equipment-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + * aaiv7:inventory/network/vpls-pes/vpls-pe/{equipment-name}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + * aaiv7:inventory/network/vpls-pes/vpls-pe/{equipment-name}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + * aaiv7:inventory/network/pnfs/pnf/{pnf-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + * aaiv7:inventory/network/pnfs/pnf/{pnf-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + */ + + public static final String L3_INTERFACE_IPV6_ADDRESS_LIST_PATH = "org.openecomp.sdnc.sli.aai.path.l3.interface.ipv6.address.list"; + public static final String VLAN_L3_INTERFACE_IPV6_ADDRESS_LIST_PATH = "org.openecomp.sdnc.sli.aai.path.vlan.l3.interface.ipv6.address.list"; + + private final String l3_interface_ipv6_address_list_path; + private final String vlan_l3_interface_ipv6_address_list_path; + + public static final String L3_INTERFACE_IPV6_ADDRESS = "l3-interface-ipv6-address"; + public static final String LIST_L3_INTERFACE_IPV6_ADDRESS = "l3-interface-ipv6-address-list.l3-interface-ipv6-address"; + public static final String VLAN_INTERFACE = "vlan-interface"; + public static final String VLAN_VLAN_INTERFACE = "vlan.vlan-interface"; + + public L3InterfaceIpv6AddressListRequest() { + l3_interface_ipv6_address_list_path = configProperties.getProperty(L3_INTERFACE_IPV6_ADDRESS_LIST_PATH); + vlan_l3_interface_ipv6_address_list_path = configProperties.getProperty(VLAN_L3_INTERFACE_IPV6_ADDRESS_LIST_PATH); + } + + @Override + public URL getRequestQueryUrl(String method) throws UnsupportedEncodingException, MalformedURLException { + return this.getRequestUrl(method, null); + } + + @Override + public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = target_uri+l3_interface_ipv6_address_list_path; + + if(requestProperties.containsKey(VLAN_INTERFACE) || requestProperties.containsKey(VLAN_VLAN_INTERFACE)){ + request_url = target_uri+vlan_l3_interface_ipv6_address_list_path; + request_url = processVLanRequestPathData(request_url, requestProperties); + } + + request_url = processPathData(request_url, requestProperties); + request_url = LInterfaceRequest.processPathData(request_url, requestProperties); +// request_url = GenericVnfRequest.processPathData(request_url, requestProperties); + + if(resourceVersion != null) { + request_url = request_url +"?resource-version="+resourceVersion; + } + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + + return http_req_url; + } + + public static String processVLanRequestPathData(String request_url, Properties requestProperties) throws UnsupportedEncodingException { + String key = null; + + if(requestProperties.containsKey(VLAN_VLAN_INTERFACE)) { + key = VLAN_VLAN_INTERFACE; + } else if(requestProperties.containsKey(VLAN_INTERFACE)) { + key = VLAN_INTERFACE; + } else { + aaiService.logKeyError(String.format("%s,%s", VLAN_INTERFACE, VLAN_VLAN_INTERFACE)); + } + + String encoded_vnf = encodeQuery(requestProperties.getProperty(key)); + + request_url = request_url.replace("{vlan-interface}", encoded_vnf) ; + aaiService.LOGwriteDateTrace("vlan-interface", requestProperties.getProperty(key)); + return request_url; + } + + @Override + public String toJSONString() { + ObjectMapper mapper = getObjectMapper(); + L3InterfaceIpv6AddressList vnfc = (L3InterfaceIpv6AddressList)requestDatum; + String json_text = null; + try { + json_text = mapper.writeValueAsString(vnfc); + } catch (JsonProcessingException exc) { + handleException(this, exc); + return null; + } + return json_text; + } + + @Override + public String[] getArgsList() { + String[] args = + { + L3_INTERFACE_IPV6_ADDRESS, + LIST_L3_INTERFACE_IPV6_ADDRESS, + VLAN_INTERFACE, + VLAN_VLAN_INTERFACE, + LInterfaceRequest.INTERFACE_NAME, + LInterfaceRequest.LINTERFACE_INTERFACE_NAME, + "generic-vnf.vnf-id" + + }; + + return args; + } + + @Override + public Class getModelClass() { + return L3InterfaceIpv6AddressList.class; + } + + public static String processPathData(String request_url, Properties requestProperties) throws UnsupportedEncodingException { + String key = L3_INTERFACE_IPV6_ADDRESS; + if(requestProperties.containsKey(LIST_L3_INTERFACE_IPV6_ADDRESS)) { + key = LIST_L3_INTERFACE_IPV6_ADDRESS; + } + + if(!requestProperties.containsKey(key)) { + aaiService.logKeyError(String.format("%s,%s", L3_INTERFACE_IPV6_ADDRESS, LIST_L3_INTERFACE_IPV6_ADDRESS)); + } + + String encoded_vnf = encodeQuery(requestProperties.getProperty(key)); + + request_url = request_url.replace("{l3-interface-ipv6-address}", encoded_vnf) ; + + aaiService.LOGwriteDateTrace("l3-interface-ipv6-address", requestProperties.getProperty(key)); + return request_url; + } +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/LInterfaceRequest.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/LInterfaceRequest.java new file mode 100644 index 00000000..2553037d --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/LInterfaceRequest.java @@ -0,0 +1,244 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.net.MalformedURLException; +import java.net.URL; +import java.util.Properties; + +import org.openecomp.aai.inventory.v10.LInterface; +import org.openecomp.sdnc.sli.aai.data.AAIDatum; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class LInterfaceRequest extends AAIRequest { + + // tenant (1602) + public static final String LAGINTERFACE_LINTERFACE_PATH = "org.openecomp.sdnc.sli.aai.path.lag.interface.l.interface"; + public static final String LAGINTERFACE_LINTERFACE_QUERY_PATH = "org.openecomp.sdnc.sli.aai.path.lag.interface.l.interface.query"; + + public static final String P_INTERFACE_LINTERFACE_PATH = "org.openecomp.sdnc.sli.aai.path.p.interface.l.interface"; + public static final String P_INTERFACE_LINTERFACE_QUERY_PATH = "org.openecomp.sdnc.sli.aai.path.p.interface.l.interface.query"; + + public static final String LAGINTERFACE_LINTERFACE_PNF_PATH = "org.openecomp.sdnc.sli.aai.path.lag.interface.l.interface.pnf"; + public static final String P_INTERFACE_LINTERFACE_PNF_PATH = "org.openecomp.sdnc.sli.aai.path.p.interface.l.interface.pnf"; + + private final String laginterface_linterface_path; + private final String laginterface_linterface_query_path; + private final String p_interface_linterface_path; + private final String p_interface_linterface_query_path; + + private final String laginterface_linterface_pnf_path; + private final String p_interface_linterface_pnf_path; + + public static final String INTERFACE_NAME = "interface-name"; + public static final String LINTERFACE_INTERFACE_NAME = "l-interface.interface-name"; + public static final String LAG_INTERFACE_INTERFACE_NAME = "lag-interface.interface-name"; + public static final String P_INTERFACE_INTERFACE_NAME = "p-interface.interface-name"; + public static final String PNF_PNF_NAME = "pnf.pnf-name"; + + public static final String ROUTER_NAME = "router-name"; + public static final String HOSTNAME = "hostname"; + + + public static enum TYPE { L2_BRIDGE_BGF, L2_BRIDGE_SBG}; + + private final TYPE type; + + public LInterfaceRequest(TYPE type) { + this.type = type; + + laginterface_linterface_path = configProperties.getProperty(LAGINTERFACE_LINTERFACE_PATH); + laginterface_linterface_query_path = configProperties.getProperty(LAGINTERFACE_LINTERFACE_QUERY_PATH); + + p_interface_linterface_path = configProperties.getProperty(P_INTERFACE_LINTERFACE_PATH); + p_interface_linterface_query_path = configProperties.getProperty(P_INTERFACE_LINTERFACE_QUERY_PATH); + + laginterface_linterface_pnf_path = configProperties.getProperty(LAGINTERFACE_LINTERFACE_PNF_PATH); + p_interface_linterface_pnf_path = configProperties.getProperty(P_INTERFACE_LINTERFACE_PNF_PATH); + } + + + @Override + public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = null; + String encoded_vnf = null; + String hostname = null; + String pnfname = null; + String interfaceName = null; + + if(type == TYPE.L2_BRIDGE_SBG) { + if(requestProperties.containsKey(PNF_PNF_NAME)) { + request_url = target_uri + laginterface_linterface_pnf_path; + } else { + request_url = target_uri + laginterface_linterface_path; + } + + if(requestProperties.containsKey(ROUTER_NAME)) { + hostname = requestProperties.getProperty(ROUTER_NAME); + encoded_vnf = encodeQuery(hostname); + request_url = request_url.replace("{hostname}", encoded_vnf); + } + + if(requestProperties.containsKey(HOSTNAME)) { + hostname = requestProperties.getProperty(HOSTNAME); + encoded_vnf = encodeQuery(hostname); + request_url = request_url.replace("{hostname}", encoded_vnf); + } + + if(requestProperties.containsKey(PNF_PNF_NAME)) { + pnfname = requestProperties.getProperty(PNF_PNF_NAME); + encoded_vnf = encodeQuery(pnfname); + request_url = request_url.replace("{pnf-name}", encoded_vnf); + } + + encoded_vnf = encodeQuery(requestProperties.getProperty(LAG_INTERFACE_INTERFACE_NAME)); + request_url = request_url.replace("{lag-interface.interface-name}", encoded_vnf) ; + + + interfaceName = requestProperties.getProperty(INTERFACE_NAME); + if(interfaceName == null || interfaceName.isEmpty()) { + interfaceName = requestProperties.getProperty(LINTERFACE_INTERFACE_NAME); + } + encoded_vnf = encodeQuery(interfaceName); + request_url = request_url.replace("{interface-name}", encoded_vnf) ; + + } + if(type == TYPE.L2_BRIDGE_BGF) { + if(requestProperties.containsKey(PNF_PNF_NAME)) { + request_url = target_uri + p_interface_linterface_pnf_path; + } else { + request_url = target_uri + p_interface_linterface_path; + } + + + if(requestProperties.containsKey(ROUTER_NAME)) { + hostname = requestProperties.getProperty(ROUTER_NAME); + encoded_vnf = encodeQuery(hostname); + request_url = request_url.replace("{hostname}", encoded_vnf); + } + + if(requestProperties.containsKey(HOSTNAME)) { + hostname = requestProperties.getProperty(HOSTNAME); + encoded_vnf = encodeQuery(hostname); + request_url = request_url.replace("{hostname}", encoded_vnf); + } + + if(requestProperties.containsKey(PNF_PNF_NAME)) { + pnfname = requestProperties.getProperty(PNF_PNF_NAME); + encoded_vnf = encodeQuery(pnfname); + request_url = request_url.replace("{pnf-name}", encoded_vnf); + } + + encoded_vnf = encodeQuery(requestProperties.getProperty(P_INTERFACE_INTERFACE_NAME)); + request_url = request_url.replace("{p-interface.interface-name}", encoded_vnf) ; + + + interfaceName = requestProperties.getProperty(INTERFACE_NAME); + if(interfaceName == null || interfaceName.isEmpty()) { + interfaceName = requestProperties.getProperty(LINTERFACE_INTERFACE_NAME); + } + encoded_vnf = encodeQuery(interfaceName); + request_url = request_url.replace("{interface-name}", encoded_vnf) ; + } + + + if(resourceVersion != null) { + request_url = request_url +"?resource-version="+resourceVersion; + } + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + if(hostname != null) + aaiService.LOGwriteDateTrace("hostname", hostname); + if(pnfname != null) + aaiService.LOGwriteDateTrace("pnf-name", pnfname); + if(requestProperties.containsKey(LAG_INTERFACE_INTERFACE_NAME)) { + aaiService.LOGwriteDateTrace("lag-interface.interface-name", requestProperties.getProperty(LAG_INTERFACE_INTERFACE_NAME)); + } + if(requestProperties.containsKey(P_INTERFACE_INTERFACE_NAME)) { + aaiService.LOGwriteDateTrace("p-interface.interface-name", requestProperties.getProperty(P_INTERFACE_INTERFACE_NAME)); + } + aaiService.LOGwriteDateTrace("interface-name", interfaceName); + + return http_req_url; + } + + @Override + public URL getRequestQueryUrl(String method) throws UnsupportedEncodingException, MalformedURLException { + return this.getRequestUrl(method, null); + } + + + @Override + public String toJSONString() { + ObjectMapper mapper = getObjectMapper(); + LInterface vnfc = (LInterface)requestDatum; + String json_text = null; + try { + json_text = mapper.writeValueAsString(vnfc); + } catch (JsonProcessingException exc) { + handleException(this, exc); + return null; + } + return json_text; + } + + + @Override + public String[] getArgsList() { + String[] args = {}; + if(type == TYPE.L2_BRIDGE_SBG) { + String[] tmpArray = {INTERFACE_NAME, LINTERFACE_INTERFACE_NAME, LAG_INTERFACE_INTERFACE_NAME, HOSTNAME, ROUTER_NAME, PNF_PNF_NAME}; + args = tmpArray; + } + if(type == TYPE.L2_BRIDGE_BGF) { + String[] tmpArray = {INTERFACE_NAME, LINTERFACE_INTERFACE_NAME, P_INTERFACE_INTERFACE_NAME, HOSTNAME, ROUTER_NAME, PNF_PNF_NAME}; + args = tmpArray; + } + + return args; + } + + @Override + public Class getModelClass() { + return LInterface.class; + } + + @Override + public String getPrimaryResourceName(String resource) { + return "l-interface"; + } + + public static final String processPathData(String request_url, Properties requestProperties) throws UnsupportedEncodingException { + String interfaceName = requestProperties.getProperty(INTERFACE_NAME); + if(interfaceName == null || interfaceName.isEmpty()) { + interfaceName = requestProperties.getProperty(LINTERFACE_INTERFACE_NAME); + } + + request_url = request_url.replace("{interface-name}", encodeQuery(interfaceName)) ; + return request_url; + } +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/LagInterfacePnfRequest.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/LagInterfacePnfRequest.java new file mode 100644 index 00000000..2c103623 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/LagInterfacePnfRequest.java @@ -0,0 +1,142 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.net.MalformedURLException; +import java.net.URL; +import java.util.Properties; + +import org.openecomp.aai.inventory.v10.LagInterface; +import org.openecomp.sdnc.sli.aai.data.AAIDatum; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class LagInterfacePnfRequest extends AAIRequest { + + // tenant (1602) + public static final String LAG_INTERFACE_PATH = "org.openecomp.sdnc.sli.aai.path.pserver.pinterface"; + public static final String LAG_INTERFACE_QUERY_PATH = "org.openecomp.sdnc.sli.aai.path.pserver.pinterface.query"; + public static final String PNF_PATH = "org.openecomp.sdnc.sli.aai.path.pnf"; + + private final String lag_interface_path; + private final String lag_interface_query_path; + + public static final String INTERFACE_NAME = "interface-name"; + public static final String LAG_INTERFACE_INTERFACE_NAME = "lag-interface.interface-name"; + public static final String PNF_NAME = "pnf-name"; + public static final String PNF_PNF_NAME = "pnf.pnf-name"; + + + public LagInterfacePnfRequest() { + lag_interface_path = configProperties.getProperty(PNF_PATH) + "/lag-interfaces/lag-interface/{interface-name}"; + lag_interface_query_path = configProperties.getProperty(LAG_INTERFACE_QUERY_PATH); + LoggerFactory.getLogger(LagInterfacePnfRequest.class).debug("org.openecomp.sdnc.sli.aai.path.pserver.pinterface=\t" + lag_interface_path); + LoggerFactory.getLogger(LagInterfacePnfRequest.class).debug("org.openecomp.sdnc.sli.aai.path.pserver.pinterface.query=\t" + lag_interface_query_path); + if(lag_interface_path == null) { + LoggerFactory.getLogger(LagInterfacePnfRequest.class).warn("org.openecomp.sdnc.sli.aai.path.pserver.pinterface PATH not found in aaiclient.properties"); + } + } + + + @Override + public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = target_uri + lag_interface_path; + String encoded_vnf = null; + + String interfaceName = null; + + if(requestProperties.containsKey(INTERFACE_NAME)) { + interfaceName = requestProperties.getProperty(INTERFACE_NAME); + } else + if(requestProperties.containsKey(LAG_INTERFACE_INTERFACE_NAME)) { + interfaceName = requestProperties.getProperty(LAG_INTERFACE_INTERFACE_NAME); + } + + encoded_vnf = encodeQuery(interfaceName); + request_url = request_url.replace("{interface-name}", encoded_vnf) ; + + request_url = processPnfRequestPathData(request_url,requestProperties); + + if(resourceVersion != null) { + request_url = request_url +"?resource-version="+resourceVersion; + } + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + aaiService.LOGwriteDateTrace("interface-name", interfaceName); + + return http_req_url; + } + + public static String processPnfRequestPathData(String request_url, Properties requestProperties) throws UnsupportedEncodingException { + + String key = PNF_NAME; + if(requestProperties.containsKey(PNF_PNF_NAME)) { + key = PNF_PNF_NAME; + } + + if(!requestProperties.containsKey(key)) { + aaiService.logKeyError(String.format("%s,%s", PNF_NAME, PNF_PNF_NAME)); + } + + String encoded_vnf = encodeQuery(requestProperties.getProperty(key)); + request_url = request_url.replace("{pnf-name}", encoded_vnf) ; + + return request_url; + } + + @Override + public URL getRequestQueryUrl(String method) throws UnsupportedEncodingException, MalformedURLException { + return this.getRequestUrl(method, null); + } + + + @Override + public String toJSONString() { + ObjectMapper mapper = getObjectMapper(); + LagInterface vnfc = (LagInterface)requestDatum; + String json_text = null; + try { + json_text = mapper.writeValueAsString(vnfc); + } catch (JsonProcessingException exc) { + handleException(this, exc); + return null; + } + return json_text; + } + + @Override + public String[] getArgsList() { + String[] args = {INTERFACE_NAME, LAG_INTERFACE_INTERFACE_NAME, PNF_PNF_NAME}; + + return args; + } + + @Override + public Class getModelClass() { + return LagInterface.class; + } +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/NamedQueryRequest.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/NamedQueryRequest.java new file mode 100644 index 00000000..4ee51745 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/NamedQueryRequest.java @@ -0,0 +1,190 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Properties; + +import org.openecomp.aai.inventory.v10.InventoryResponseItems; +import org.openecomp.sdnc.sli.aai.data.AAIDatum; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.AnnotationIntrospector; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.databind.type.TypeFactory; +import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector; + +public class NamedQueryRequest extends AAIRequest { + + public static final String NAMED_SEARCH_PATH = "org.openecomp.sdnc.sli.aai.query.named"; + + private final String named_search_path; + + public static final String NAMED_QUERY_UUID = "named-query-uuid"; + public static final String PREFIX = "prefix"; + + + public NamedQueryRequest() { + named_search_path = configProperties.getProperty(NAMED_SEARCH_PATH); + } + + @Override + public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = target_uri+named_search_path; + + request_url = processPathData(request_url, requestProperties); + + if(resourceVersion != null) { + request_url = request_url +"?resource-version="+resourceVersion; + } + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + + return http_req_url; + } + + @Override + public URL getRequestQueryUrl(String method) throws UnsupportedEncodingException, MalformedURLException { + return getRequestUrl(method, null); + } + + + @Override + public String toJSONString() { + ObjectMapper mapper = AAIService.getObjectMapper(); + mapper.setSerializationInclusion(Include.NON_NULL); + mapper.setSerializationInclusion(Include.NON_EMPTY); + mapper.setSerializationInclusion(Include.NON_DEFAULT); + + AnnotationIntrospector introspector = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance()); + AnnotationIntrospector secondary = new JacksonAnnotationIntrospector(); + mapper.setAnnotationIntrospector(AnnotationIntrospector.pair(introspector, secondary)); + mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + + AAIDatum tenant = (AAIDatum)requestDatum; + String json_text = null; + try { + ObjectNode node = mapper.valueToTree(tenant); + Iterator it = node.elements(); + while(it.hasNext()){ + JsonNode jn = it.next(); + JsonNode child = jn.get("instance-filter"); + if(child != null) { + child = child.get(0); + if(child.has("l3-network")) { + JsonNode innerChild = child.get("l3-network"); + if(innerChild != null) { + if(innerChild instanceof ObjectNode) { + ObjectNode on = ObjectNode.class.cast(innerChild); + List namesToDelete = new ArrayList(); + Iterator names = on.fieldNames(); + while(names.hasNext()) { + String name = names.next(); + if(name != null && name.startsWith("is-")) { + namesToDelete.add(name); + } + } + for(String nameToDelete : namesToDelete) { + on.remove(nameToDelete); + } + } + } + } else if(child.has("pnf")) { + JsonNode innerChild = child.get("pnf"); + if(innerChild != null) { + if(innerChild instanceof ObjectNode) { + ObjectNode on = ObjectNode.class.cast(innerChild); + List namesToDelete = new ArrayList(); + Iterator names = on.fieldNames(); + while(names.hasNext()) { + String name = names.next(); + if(name != null && name.startsWith("in-maint")) { + namesToDelete.add(name); + } + } + for(String nameToDelete : namesToDelete) { + on.remove(nameToDelete); + } + } + } + } + } + } + json_text = node.toString(); + if(json_text == null) + json_text = mapper.writeValueAsString(tenant); + } catch (JsonProcessingException exc) { + handleException(this, exc); + return null; + } + return json_text; + } + + + @Override + public String[] getArgsList() { + String[] args = {NAMED_QUERY_UUID, PREFIX}; + return args; + } + + + @Override + public Class getModelClass() { + return InventoryResponseItems.class; + } + + + public static String processPathData(String request_url, Properties requestProperties) throws UnsupportedEncodingException { + + + String encoded_vnf ; + String key = NAMED_QUERY_UUID; + + if(requestProperties.containsKey(key)) { + encoded_vnf = encodeQuery(requestProperties.getProperty(key)); + request_url = request_url.replace("{named-query-uuid}", encoded_vnf) ; + aaiService.LOGwriteDateTrace("named-query-uuid", requestProperties.getProperty(key)); + } + + key = PREFIX; + + if(requestProperties.containsKey(key)) { + encoded_vnf = encodeQuery(requestProperties.getProperty(key)); + request_url = request_url.replace("{prefix}", encoded_vnf) ; + aaiService.LOGwriteDateTrace("prefix", requestProperties.getProperty(key)); + } + + return request_url; + } +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/NodesQueryRequest.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/NodesQueryRequest.java new file mode 100644 index 00000000..c4141876 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/NodesQueryRequest.java @@ -0,0 +1,144 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.net.MalformedURLException; +import java.net.URL; +import java.util.Properties; + +import org.openecomp.aai.inventory.v10.SearchResults; +import org.openecomp.sdnc.sli.aai.data.AAIDatum; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class NodesQueryRequest extends AAIRequest { + + public static final String NODES_SEARCH_PATH = "org.openecomp.sdnc.sli.aai.query.nodes"; + + private final String nodes_search_path; + + public static final String NODE_TYPE = "node-type"; + public static final String ENTITY_IDENTIFIER = "entity-identifier"; + public static final String ENTITY_VALUE = "entity-value"; + + + public NodesQueryRequest() { + nodes_search_path = configProperties.getProperty(NODES_SEARCH_PATH); + } + + +// @Override +// public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { +// +// String request_url = target_uri+generic_search_path; +// String key = START_NODE_TYPE; +// +// String encoded_vnf = encodeQuery(requestProperties.getProperty(key)); +// request_url = request_url.replace("{vnf-id}", encoded_vnf) ; +// +// if(resourceVersion != null) { +// request_url = request_url +"?resource-version="+resourceVersion; +// } +// URL http_req_url = new URL(request_url); +// +// aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); +// +// +// return http_req_url; +// } + + @Override + public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = target_uri+nodes_search_path; + + request_url = processPathData(request_url, requestProperties); + + if(resourceVersion != null) { + request_url = request_url +"?resource-version="+resourceVersion; + } + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + + return http_req_url; + } + + @Override + public URL getRequestQueryUrl(String method) throws UnsupportedEncodingException, MalformedURLException { + return getRequestUrl(method, null); + } + + + @Override + public String toJSONString() { + ObjectMapper mapper = getObjectMapper(); + SearchResults tenant = (SearchResults)requestDatum; + String json_text = null; + try { + json_text = mapper.writeValueAsString(tenant); + } catch (JsonProcessingException exc) { + handleException(this, exc); + return null; + } + return json_text; + } + + + @Override + public String[] getArgsList() { + String[] args = {NODE_TYPE, ENTITY_IDENTIFIER, ENTITY_VALUE}; + return args; + } + + + @Override + public Class getModelClass() { + return SearchResults.class; + } + + + public static String processPathData(String request_url, Properties requestProperties) throws UnsupportedEncodingException { + + String key = ENTITY_IDENTIFIER; + + String encoded_vnf = encodeQuery(requestProperties.getProperty(key)); + request_url = request_url.replace("{entity-identifier}", encoded_vnf) ; + aaiService.LOGwriteDateTrace("entity-identifier", requestProperties.getProperty(key)); + + key = ENTITY_VALUE; + + encoded_vnf = encodeQuery(requestProperties.getProperty(key)); + request_url = request_url.replace("{entity-name}", encoded_vnf) ; + aaiService.LOGwriteDateTrace("entity-name", requestProperties.getProperty(key)); + + key = NODE_TYPE; + + encoded_vnf = encodeQuery(requestProperties.getProperty(key)); + request_url = request_url.replace("{node-type}", encoded_vnf) ; + aaiService.LOGwriteDateTrace("node-type", requestProperties.getProperty(key)); + + return request_url; + } +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/PInterfacePnfRequest.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/PInterfacePnfRequest.java new file mode 100644 index 00000000..99bce9d1 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/PInterfacePnfRequest.java @@ -0,0 +1,142 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.net.MalformedURLException; +import java.net.URL; +import java.util.Properties; + +import org.openecomp.aai.inventory.v10.PInterface; +import org.openecomp.sdnc.sli.aai.data.AAIDatum; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class PInterfacePnfRequest extends AAIRequest { + + // tenant (1602) + public static final String PINTERFACE_PATH = "org.openecomp.sdnc.sli.aai.path.pserver.pinterface"; + public static final String PINTERFACE_QUERY_PATH = "org.openecomp.sdnc.sli.aai.path.pserver.pinterface.query"; + public static final String PNF_PATH = "org.openecomp.sdnc.sli.aai.path.pnf"; + + private final String pinterface_path; + private final String pinterface_query_path; + + public static final String INTERFACE_NAME = "interface-name"; + public static final String PINTERFACE_INTERFACE_NAME = "p-interface.interface-name"; + public static final String PNF_NAME = "pnf-name"; + public static final String PNF_PNF_NAME = "pnf.pnf-name"; + + + public PInterfacePnfRequest() { + pinterface_path = configProperties.getProperty(PNF_PATH) + "/p-interfaces/p-interface/{interface-name}"; + pinterface_query_path = configProperties.getProperty(PINTERFACE_QUERY_PATH); + LoggerFactory.getLogger(PInterfacePnfRequest.class).debug("org.openecomp.sdnc.sli.aai.path.pserver.pinterface=\t" + pinterface_path); + LoggerFactory.getLogger(PInterfacePnfRequest.class).debug("org.openecomp.sdnc.sli.aai.path.pserver.pinterface.query=\t" + pinterface_query_path); + if(pinterface_path == null) { + LoggerFactory.getLogger(PInterfacePnfRequest.class).warn("org.openecomp.sdnc.sli.aai.path.pserver.pinterface PATH not found in aaiclient.properties"); + } + } + + + @Override + public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = target_uri + pinterface_path; + String encoded_vnf = null; + + String interfaceName = null; + + if(requestProperties.containsKey(INTERFACE_NAME)) { + interfaceName = requestProperties.getProperty(INTERFACE_NAME); + } else + if(requestProperties.containsKey(PINTERFACE_INTERFACE_NAME)) { + interfaceName = requestProperties.getProperty(PINTERFACE_INTERFACE_NAME); + } + + encoded_vnf = encodeQuery(interfaceName); + request_url = request_url.replace("{interface-name}", encoded_vnf) ; + + request_url = processPnfRequestPathData(request_url,requestProperties); + + if(resourceVersion != null) { + request_url = request_url +"?resource-version="+resourceVersion; + } + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + aaiService.LOGwriteDateTrace("interface-name", interfaceName); + + return http_req_url; + } + + public static String processPnfRequestPathData(String request_url, Properties requestProperties) throws UnsupportedEncodingException { + + String key = PNF_NAME; + if(requestProperties.containsKey(PNF_PNF_NAME)) { + key = PNF_PNF_NAME; + } + + if(!requestProperties.containsKey(key)) { + aaiService.logKeyError(String.format("%s,%s", PNF_NAME, PNF_PNF_NAME)); + } + + String encoded_vnf = encodeQuery(requestProperties.getProperty(key)); + request_url = request_url.replace("{pnf-name}", encoded_vnf) ; + + return request_url; + } + + @Override + public URL getRequestQueryUrl(String method) throws UnsupportedEncodingException, MalformedURLException { + return this.getRequestUrl(method, null); + } + + + @Override + public String toJSONString() { + ObjectMapper mapper = getObjectMapper(); + PInterface vnfc = (PInterface)requestDatum; + String json_text = null; + try { + json_text = mapper.writeValueAsString(vnfc); + } catch (JsonProcessingException exc) { + handleException(this, exc); + return null; + } + return json_text; + } + + @Override + public String[] getArgsList() { + String[] args = {INTERFACE_NAME, PINTERFACE_INTERFACE_NAME, PNF_NAME, PNF_PNF_NAME}; + + return args; + } + + @Override + public Class getModelClass() { + return PInterface.class; + } +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/PInterfaceRequest.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/PInterfaceRequest.java new file mode 100644 index 00000000..a08a3929 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/PInterfaceRequest.java @@ -0,0 +1,132 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.net.MalformedURLException; +import java.net.URL; + +import org.openecomp.aai.inventory.v10.PInterface; +import org.openecomp.sdnc.sli.aai.data.AAIDatum; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class PInterfaceRequest extends AAIRequest { + + // tenant (1602) + public static final String PINTERFACE_PATH = "org.openecomp.sdnc.sli.aai.path.pserver.pinterface"; + public static final String PINTERFACE_QUERY_PATH = "org.openecomp.sdnc.sli.aai.path.pserver.pinterface.query"; + + private final String pinterface_path; + private final String pinterface_query_path; + + public static final String HOSTNAME = "hostname"; + public static final String PSERVER_HOSTNAME = "pserver.hostname"; + public static final String INTERFACE_NAME = "interface-name"; + public static final String PINTERFACE_INTERFACE_NAME = "p-interface.interface-name"; + + + public PInterfaceRequest() { + pinterface_path = configProperties.getProperty(PINTERFACE_PATH); + pinterface_query_path = configProperties.getProperty(PINTERFACE_QUERY_PATH); + LoggerFactory.getLogger(PInterfaceRequest.class).debug("org.openecomp.sdnc.sli.aai.path.pserver.pinterface=\t" + pinterface_path); + LoggerFactory.getLogger(PInterfaceRequest.class).debug("org.openecomp.sdnc.sli.aai.path.pserver.pinterface.query=\t" + pinterface_query_path); + if(pinterface_path == null) { + LoggerFactory.getLogger(PInterfaceRequest.class).warn("org.openecomp.sdnc.sli.aai.path.pserver.pinterface PATH not found in aaiclient.properties"); + } + } + + + @Override + public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = target_uri + pinterface_path; + String encoded_vnf = null; + + String hostname = null; + String interfaceName = null; + + if(requestProperties.containsKey(HOSTNAME)) { + hostname = requestProperties.getProperty(HOSTNAME); + } + if(requestProperties.containsKey(PSERVER_HOSTNAME)) { + hostname = requestProperties.getProperty(PSERVER_HOSTNAME); + } + + if(requestProperties.containsKey(INTERFACE_NAME)) { + interfaceName = requestProperties.getProperty(INTERFACE_NAME); + } + if(requestProperties.containsKey(PINTERFACE_INTERFACE_NAME)) { + interfaceName = requestProperties.getProperty(PINTERFACE_INTERFACE_NAME); + } + + encoded_vnf = encodeQuery(hostname); + request_url = request_url.replace("{hostname}", encoded_vnf) ; + + encoded_vnf = encodeQuery(interfaceName); + request_url = request_url.replace("{interface-name}", encoded_vnf) ; + + if(resourceVersion != null) { + request_url = request_url +"?resource-version="+resourceVersion; + } + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + aaiService.LOGwriteDateTrace("hostname", hostname); + aaiService.LOGwriteDateTrace("interface-name", hostname); + + return http_req_url; + } + + @Override + public URL getRequestQueryUrl(String method) throws UnsupportedEncodingException, MalformedURLException { + return this.getRequestUrl(method, null); + } + + + @Override + public String toJSONString() { + ObjectMapper mapper = getObjectMapper(); + PInterface vnfc = (PInterface)requestDatum; + String json_text = null; + try { + json_text = mapper.writeValueAsString(vnfc); + } catch (JsonProcessingException exc) { + handleException(this, exc); + return null; + } + return json_text; + } + + @Override + public String[] getArgsList() { + String[] args = {HOSTNAME, PSERVER_HOSTNAME, INTERFACE_NAME, PINTERFACE_INTERFACE_NAME}; + return args; + } + + @Override + public Class getModelClass() { + return PInterface.class; + } +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/PathRequest.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/PathRequest.java new file mode 100644 index 00000000..0e110a11 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/PathRequest.java @@ -0,0 +1,88 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.net.MalformedURLException; +import java.net.URL; + +import org.openecomp.sdnc.sli.aai.data.AAIDatum; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class PathRequest extends AAIRequest { + + private final Class classType; + + public static final String RESOURCE_PATH = "resource-path"; + + public PathRequest(Class type) { + classType = (Class)type; + } + + + @Override + public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = target_uri + "{resource-path}"; + + String encoded_vnf = requestProperties.getProperty(RESOURCE_PATH); + request_url = request_url.replace("{resource-path}", encoded_vnf) ; + + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + + return http_req_url; + } + + @Override + public URL getRequestQueryUrl(String method) throws UnsupportedEncodingException, MalformedURLException { + return this.getRequestUrl(method, null); + } + + + @Override + public String toJSONString() { + ObjectMapper mapper = getObjectMapper(); + String json_text = null; + try { + json_text = mapper.writeValueAsString(classType); + } catch (JsonProcessingException exc) { + handleException(this, exc); + return null; + } + return json_text; + } + + @Override + public String[] getArgsList() { + String[] args = {RESOURCE_PATH}; + return args; + } + + @Override + public Class getModelClass() { + return classType; + } +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/PhysicalLinkRequest.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/PhysicalLinkRequest.java new file mode 100644 index 00000000..a03298ae --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/PhysicalLinkRequest.java @@ -0,0 +1,112 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.net.MalformedURLException; +import java.net.URL; + +import org.openecomp.aai.inventory.v10.PhysicalLink; +import org.openecomp.sdnc.sli.aai.data.AAIDatum; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class PhysicalLinkRequest extends AAIRequest { + + // physical link + public static final String PHYSICAL_LINK_PATH = "org.openecomp.sdnc.sli.aai.path.physical.link"; + public static final String PHYSICAL_LINK_QUERY_PATH = "org.openecomp.sdnc.sli.aai.path.physical.link.query"; + + private final String physical_link_path; + private final String physical_link_query_path; + + public static final String LINK_NAME = "link-name"; + public static final String PHYSICAL_LINK_NAME = "physical-link.link-name"; + + + public PhysicalLinkRequest() { + physical_link_path = configProperties.getProperty(PHYSICAL_LINK_PATH); + physical_link_query_path = configProperties.getProperty(PHYSICAL_LINK_QUERY_PATH); + } + + @Override + public URL getRequestQueryUrl(String method) throws UnsupportedEncodingException, MalformedURLException { + return this.getRequestUrl(method, null); + } + + @Override + public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = target_uri+physical_link_path; + + String linkName = null; + if(requestProperties.containsKey(LINK_NAME)) { + linkName = requestProperties.getProperty(LINK_NAME); + } + + if(requestProperties.containsKey(PHYSICAL_LINK_NAME)) { + linkName = requestProperties.getProperty(PHYSICAL_LINK_NAME); + } + + + String encoded_vnf = encodeQuery(linkName); + request_url = request_url.replace("{link-name}", encoded_vnf) ; + + if(resourceVersion != null) { + request_url = request_url +"?resource-version="+resourceVersion; + } + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + aaiService.LOGwriteDateTrace("link-name", linkName); + + return http_req_url; + } + + + @Override + public String toJSONString() { + ObjectMapper mapper = getObjectMapper(); + PhysicalLink vpe = (PhysicalLink)requestDatum; + String json_text = null; + try { + json_text = mapper.writeValueAsString(vpe); + } catch (JsonProcessingException exc) { + handleException(this, exc); + return null; + } + return json_text; + } + + @Override + public String[] getArgsList() { + String[] args = {LINK_NAME, PHYSICAL_LINK_NAME}; + + return args; + } + + @Override + public Class getModelClass() { + return PhysicalLink.class; + } +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/RelationshipRequest.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/RelationshipRequest.java new file mode 100644 index 00000000..f15cbb59 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/RelationshipRequest.java @@ -0,0 +1,126 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.net.MalformedURLException; +import java.net.URL; + +import org.openecomp.aai.inventory.v10.RelationshipList; +import org.openecomp.sdnc.sli.aai.data.AAIDatum; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class RelationshipRequest extends AAIRequest { + + // tenant (1602) + public static final String RELATIONSHIP_LIST_PATH = "org.openecomp.sdnc.sli.aai.path.relationship.list"; + public static final String RELATIONSHIP_LIST_QUERY_PATH = "org.openecomp.sdnc.sli.aai.path.relationship.list.query"; + + private final String relationship_path; + private final String relationship_query_path; + + public static final String RELATED_TO = "related-to"; + public static final String RELATIONSHIP_KEY = "relationship-key"; + + public RelationshipRequest() { + relationship_path = configProperties.getProperty(RELATIONSHIP_LIST_PATH, "/relationship-list/relationship"); + relationship_query_path = configProperties.getProperty(RELATIONSHIP_LIST_QUERY_PATH); + } + + + @Override + public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { + + AAIRequest masterRequest = (AAIRequest)requestProperties.get(MASTER_REQUEST); + URL masterURL = masterRequest.getRequestUrl(method, null); + + String request_url = masterURL.toString(); + request_url = request_url + relationship_path; + + if(request_url.contains("//")) { + request_url = request_url.replaceAll("//", "/"); + } + + if(requestProperties.containsKey(RELATED_TO)) { + String encoded_vnf = encodeQuery(requestProperties.getProperty(RELATED_TO)); + request_url = request_url.replace("{related-to}", encoded_vnf) ; + } + +// if(resourceVersion != null) { +// request_url = request_url +"?resource-version="+resourceVersion; +// } + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + aaiService.LOGwriteDateTrace("related-to", requestProperties.getProperty(RELATED_TO)); + + return http_req_url; + } + + @Override + public URL getRequestQueryUrl(String method) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = target_uri+relationship_query_path; + String encoded_vnf = encodeQuery(requestProperties.getProperty(RELATIONSHIP_KEY)); + request_url = request_url.replace("{tenant-name}", encoded_vnf) ; + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + aaiService.LOGwriteDateTrace("tenant_name", requestProperties.getProperty(RELATIONSHIP_KEY)); + + return http_req_url; + } + + + @Override + public String toJSONString() { + ObjectMapper mapper = getObjectMapper(); + Object tenant = requestDatum; + String json_text = null; + try { + json_text = mapper.writeValueAsString(tenant); + } catch (JsonProcessingException exc) { + handleException(this, exc); + return null; + } + return json_text; + } + + + @Override + public String[] getArgsList() { + String[] args = {RELATED_TO, RELATIONSHIP_KEY}; + return args; + } + + + @Override + public Class getModelClass() { + return RelationshipList.class; + } + + public boolean isDeleteDataRequired() { + return true; + } +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/SelfLinkRequest.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/SelfLinkRequest.java new file mode 100644 index 00000000..7c307652 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/SelfLinkRequest.java @@ -0,0 +1,98 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.net.MalformedURLException; +import java.net.URL; + +import org.openecomp.sdnc.sli.aai.data.AAIDatum; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.Joiner; + +public class SelfLinkRequest extends AAIRequest { + + private final Class classType; + + public static final String SELFLINK = "selflink"; + + public SelfLinkRequest(Class type) { + classType = (Class)type; + } + + + @Override + public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = null; + + request_url = requestProperties.getProperty(SELFLINK); + + String query = null; + + if(request_url.contains("?")) { + query = request_url.substring(request_url.indexOf("?")); + Joiner.MapJoiner mapJoiner = Joiner.on(",").withKeyValueSeparator("="); +// String queryString = mapJoiner.join(query); + } else { + request_url = request_url + "?depth=1"; + } + + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + + return http_req_url; + } + + @Override + public URL getRequestQueryUrl(String method) throws UnsupportedEncodingException, MalformedURLException { + return this.getRequestUrl(method, null); + } + + + @Override + public String toJSONString() { + ObjectMapper mapper = getObjectMapper(); + String json_text = null; + try { + json_text = mapper.writeValueAsString(classType); + } catch (JsonProcessingException exc) { + handleException(this, exc); + return null; + } + return json_text; + } + + @Override + public String[] getArgsList() { + String[] args = {SELFLINK}; + return args; + } + + @Override + public Class getModelClass() { + return classType; + } +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/SubInterfaceRequest.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/SubInterfaceRequest.java new file mode 100644 index 00000000..1220ee9a --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/SubInterfaceRequest.java @@ -0,0 +1,184 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.net.MalformedURLException; +import java.net.URL; +import java.util.Properties; + +import org.openecomp.aai.inventory.v10.LInterface; +import org.openecomp.sdnc.sli.aai.data.AAIDatum; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class SubInterfaceRequest extends AAIRequest { + + // tenant (1602) + public static final String PNF_LAGINTERFACE_SUBINTERFACE_PATH = "org.openecomp.sdnc.sli.aai.path.pnf.lag.interface.subinterface"; + public static final String PNF_LAGINTERFACE_SUBINTERFACE_QUERY_PATH = "org.openecomp.sdnc.sli.aai.path.pnf.lag.interface.subinterface.query"; + + public static final String PNF_P_INTERFACE_SUBINTERFACE_PATH = "org.openecomp.sdnc.sli.aai.path.pnf.p.interface.l.interface"; + public static final String PNF_P_INTERFACE_SUBINTERFACE_QUERY_PATH = "org.openecomp.sdnc.sli.aai.path.pnf.p.interface.l.interface.query"; + + private final String pnf_laginterface_subinterface_path; + private final String pnf_laginterface_subinterface_query_path; + private final String pnf_p_interface_subinterface_path; + private final String pnf_p_interface_subinterface_query_path; + + public static final String SUBINTERFACE_INTERFACE_NAME = "l-interface.interface-name"; + public static final String LAG_INTERFACE_INTERFACE_NAME = "lag-interface.interface-name"; + public static final String PNF_PNF_NAME = "pnf.pnf-name"; + public static enum TYPE { L2_BRIDGE_BGF, L2_BRIDGE_SBG}; + + private final TYPE type; + + public SubInterfaceRequest(TYPE type) { + this.type = type; + + pnf_laginterface_subinterface_path = configProperties.getProperty(PNF_LAGINTERFACE_SUBINTERFACE_PATH); + pnf_laginterface_subinterface_query_path = configProperties.getProperty(PNF_LAGINTERFACE_SUBINTERFACE_QUERY_PATH); + + pnf_p_interface_subinterface_path = configProperties.getProperty(PNF_P_INTERFACE_SUBINTERFACE_PATH); + pnf_p_interface_subinterface_query_path = configProperties.getProperty(PNF_P_INTERFACE_SUBINTERFACE_QUERY_PATH); + } + + + @Override + public URL getRequestUrl(String method, String resourceVersion) throws UnsupportedEncodingException, MalformedURLException { + + String request_url = null; + String encoded_vnf = null; + + String pnfname = null; + String interfaceName = null; + + if(type == TYPE.L2_BRIDGE_SBG) { + request_url = target_uri + pnf_laginterface_subinterface_path; + + if(requestProperties.containsKey(PNF_PNF_NAME)) { + pnfname = requestProperties.getProperty(PNF_PNF_NAME); + encoded_vnf = encodeQuery(pnfname); + request_url = request_url.replace("{pnf-name}", encoded_vnf); + } + + encoded_vnf = encodeQuery(requestProperties.getProperty(LAG_INTERFACE_INTERFACE_NAME)); + request_url = request_url.replace("{lag-interface.interface-name}", encoded_vnf) ; + + + interfaceName = requestProperties.getProperty(SUBINTERFACE_INTERFACE_NAME); + encoded_vnf = encodeQuery(interfaceName); + request_url = request_url.replace("{interface-name}", encoded_vnf) ; + + } + if(type == TYPE.L2_BRIDGE_BGF) { + request_url = target_uri + pnf_p_interface_subinterface_path; + + if(requestProperties.containsKey(PNF_PNF_NAME)) { + pnfname = requestProperties.getProperty(PNF_PNF_NAME); + encoded_vnf = encodeQuery(pnfname); + request_url = request_url.replace("{pnf-name}", encoded_vnf); + } + + encoded_vnf = encodeQuery(requestProperties.getProperty(PInterfaceRequest.PINTERFACE_INTERFACE_NAME)); + request_url = request_url.replace("{p-interface.interface-name}", encoded_vnf) ; + + + interfaceName = requestProperties.getProperty(SUBINTERFACE_INTERFACE_NAME); + encoded_vnf = encodeQuery(interfaceName); + request_url = request_url.replace("{interface-name}", encoded_vnf) ; + } + + + if(resourceVersion != null) { + request_url = request_url +"?resource-version="+resourceVersion; + } + URL http_req_url = new URL(request_url); + + aaiService.LOGwriteFirstTrace(method, http_req_url.toString()); + + if(pnfname != null) + aaiService.LOGwriteDateTrace("pnf-name", pnfname); + if(requestProperties.containsKey(LAG_INTERFACE_INTERFACE_NAME)) { + aaiService.LOGwriteDateTrace("lag-interface.interface-name", requestProperties.getProperty(LAG_INTERFACE_INTERFACE_NAME)); + } + if(requestProperties.containsKey(PInterfaceRequest.PINTERFACE_INTERFACE_NAME)) { + aaiService.LOGwriteDateTrace("p-interface.interface-name", requestProperties.getProperty(PInterfaceRequest.PINTERFACE_INTERFACE_NAME)); + } + aaiService.LOGwriteDateTrace("interface-name", interfaceName); + + return http_req_url; + } + + @Override + public URL getRequestQueryUrl(String method) throws UnsupportedEncodingException, MalformedURLException { + return this.getRequestUrl(method, null); + } + + + @Override + public String toJSONString() { + ObjectMapper mapper = getObjectMapper(); + LInterface vnfc = (LInterface)requestDatum; + String json_text = null; + try { + json_text = mapper.writeValueAsString(vnfc); + } catch (JsonProcessingException exc) { + handleException(this, exc); + return null; + } + return json_text; + } + + + @Override + public String[] getArgsList() { + String[] args = {}; + if(type == TYPE.L2_BRIDGE_SBG) { + String[] tmpArray = {SUBINTERFACE_INTERFACE_NAME, LAG_INTERFACE_INTERFACE_NAME, PNF_PNF_NAME}; + args = tmpArray; + } + if(type == TYPE.L2_BRIDGE_BGF) { + String[] tmpArray = {SUBINTERFACE_INTERFACE_NAME, PInterfaceRequest.PINTERFACE_INTERFACE_NAME, PNF_PNF_NAME}; + args = tmpArray; + } + + return args; + } + + @Override + public Class getModelClass() { + return LInterface.class; + } + + @Override + public String getPrimaryResourceName(String resource) { + return "sub-interface"; + } + + public static final String processPathData(String request_url, Properties requestProperties) throws UnsupportedEncodingException { + String interfaceName = requestProperties.getProperty(SUBINTERFACE_INTERFACE_NAME); + request_url = request_url.replace("{interface-name}", encodeQuery(interfaceName)) ; + return request_url; + } +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/UpdateRequest.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/UpdateRequest.java new file mode 100644 index 00000000..696f30bd --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/UpdateRequest.java @@ -0,0 +1,106 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.net.MalformedURLException; +import java.net.URL; +import java.util.Map; +import java.util.Properties; + +import org.openecomp.sdnc.sli.aai.data.AAIDatum; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class UpdateRequest extends AAIRequest { + + private AAIRequest request; + private Map params; + + public UpdateRequest(AAIRequest request, Map parms) { + this.request = request; + this.params = parms; + } + + @Override + public URL getRequestUrl(String method, String resourceVersion) + throws UnsupportedEncodingException, MalformedURLException { + return request.getRequestUrl(method, resourceVersion); + } + + @Override + public URL getRequestQueryUrl(String method) throws UnsupportedEncodingException, MalformedURLException { + return request.getRequestQueryUrl(method); + } + + @Override + public String toJSONString() { + ObjectMapper mapper = AAIService.getObjectMapper(); + String json = null; + + try { + json = mapper.writeValueAsString(params); + } catch (JsonProcessingException e) { + LOG.error("Could not convert parameters of " + request.getRequestObject().getClass().getName(), e); + } + + return json; + } + + @Override + public String[] getArgsList() { + return request.getArgsList(); + } + + @Override + public Class getModelClass() { + return request.getModelClass(); + } + + @Override + public void addRequestProperty(String key, String value) { + request.requestProperties.put(key, value); + } + + public static String processPathData(String request_url, Properties requestProperties) throws UnsupportedEncodingException { + +// if(request != null) { +// Class clazz = request.getClass(); +// Method function = null; +// try { +// function = clazz.getMethod("processPathData", request_url.getClass(), requestProperties.getClass()); +// request_url = (String) function.invoke(null, request_url, requestProperties); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } + +// request.processPathData(request_url, requestProperties); + return request_url; + } + + public void processRequestPathValues(Map nameValues) { + request.processRequestPathValues(nameValues); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/AAIDatum.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/AAIDatum.java new file mode 100644 index 00000000..fe238026 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/AAIDatum.java @@ -0,0 +1,26 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.data; + +public interface AAIDatum { + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/EchoResponse.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/EchoResponse.java new file mode 100644 index 00000000..1b9cb8d4 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/EchoResponse.java @@ -0,0 +1,76 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.data; + +import java.util.HashMap; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "responseMessages" +}) +public class EchoResponse implements AAIDatum { + + @JsonProperty("responseMessages") + private ResponseMessages responseMessages; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The responseMessages + */ + @JsonProperty("responseMessages") + public ResponseMessages getResponseMessages() { + return responseMessages; + } + + /** + * + * @param responseMessages + * The responseMessages + */ + @JsonProperty("responseMessages") + public void setResponseMessages(ResponseMessages responseMessages) { + this.responseMessages = responseMessages; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/ErrorResponse.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/ErrorResponse.java new file mode 100644 index 00000000..be5368d1 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/ErrorResponse.java @@ -0,0 +1,78 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.data; + +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.Generated; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "requestError" +}) +public class ErrorResponse { + + @JsonProperty("requestError") + private RequestError requestError; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The requestError + */ + @JsonProperty("requestError") + public RequestError getRequestError() { + return requestError; + } + + /** + * + * @param requestError + * The requestError + */ + @JsonProperty("requestError") + public void setRequestError(RequestError requestError) { + this.requestError = requestError; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/RequestError.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/RequestError.java new file mode 100644 index 00000000..df875f8c --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/RequestError.java @@ -0,0 +1,78 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.data; + +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.Generated; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "serviceException" +}) +public class RequestError { + + @JsonProperty("serviceException") + private ServiceException serviceException; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The serviceException + */ + @JsonProperty("serviceException") + public ServiceException getServiceException() { + return serviceException; + } + + /** + * + * @param serviceException + * The serviceException + */ + @JsonProperty("serviceException") + public void setServiceException(ServiceException serviceException) { + this.serviceException = serviceException; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/ResourceVersion.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/ResourceVersion.java new file mode 100644 index 00000000..5ac06e6b --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/ResourceVersion.java @@ -0,0 +1,28 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.data; + +public interface ResourceVersion { + + public String getResourceVersion(); + public void setResourceVersion(String resourceVersion); +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/ResponseMessage.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/ResponseMessage.java new file mode 100644 index 00000000..c1f9582a --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/ResponseMessage.java @@ -0,0 +1,122 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.data; + +import java.util.HashMap; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "messageId", + "text", + "variables" +}) +public class ResponseMessage { + + @JsonProperty("messageId") + private String messageId; + @JsonProperty("text") + private String text; + @JsonProperty("variables") + private Variables variables; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The messageId + */ + @JsonProperty("messageId") + public String getMessageId() { + return messageId; + } + + /** + * + * @param messageId + * The messageId + */ + @JsonProperty("messageId") + public void setMessageId(String messageId) { + this.messageId = messageId; + } + + /** + * + * @return + * The text + */ + @JsonProperty("text") + public String getText() { + return text; + } + + /** + * + * @param text + * The text + */ + @JsonProperty("text") + public void setText(String text) { + this.text = text; + } + + /** + * + * @return + * The variables + */ + @JsonProperty("variables") + public Variables getVariables() { + return variables; + } + + /** + * + * @param variables + * The variables + */ + @JsonProperty("variables") + public void setVariables(Variables variables) { + this.variables = variables; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/ResponseMessages.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/ResponseMessages.java new file mode 100644 index 00000000..5af83aae --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/ResponseMessages.java @@ -0,0 +1,78 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.data; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "responseMessage" +}) +public class ResponseMessages { + + @JsonProperty("responseMessage") + private List responseMessage = new ArrayList(); + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The responseMessage + */ + @JsonProperty("responseMessage") + public List getResponseMessage() { + return responseMessage; + } + + /** + * + * @param responseMessage + * The responseMessage + */ + @JsonProperty("responseMessage") + public void setResponseMessage(List responseMessage) { + this.responseMessage = responseMessage; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/ServiceException.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/ServiceException.java new file mode 100644 index 00000000..b02b448e --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/ServiceException.java @@ -0,0 +1,126 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.data; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Generated; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "messageId", + "text", + "variables" +}) +public class ServiceException { + + @JsonProperty("messageId") + private String messageId; + @JsonProperty("text") + private String text; + @JsonProperty("variables") + private List variables = new ArrayList(); + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The messageId + */ + @JsonProperty("messageId") + public String getMessageId() { + return messageId; + } + + /** + * + * @param messageId + * The messageId + */ + @JsonProperty("messageId") + public void setMessageId(String messageId) { + this.messageId = messageId; + } + + /** + * + * @return + * The text + */ + @JsonProperty("text") + public String getText() { + return text; + } + + /** + * + * @param text + * The text + */ + @JsonProperty("text") + public void setText(String text) { + this.text = text; + } + + /** + * + * @return + * The variables + */ + @JsonProperty("variables") + public List getVariables() { + return variables; + } + + /** + * + * @param variables + * The variables + */ + @JsonProperty("variables") + public void setVariables(List variables) { + this.variables = variables; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/SubInterface.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/SubInterface.java new file mode 100644 index 00000000..a85e0219 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/SubInterface.java @@ -0,0 +1,171 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.data; + +import java.util.HashMap; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +import org.openecomp.aai.inventory.v10.RelationshipList; +import org.openecomp.aai.inventory.v10.Vlans; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "interface-name", + "interface-role", + "resource-version", + "vlans", + "relationshipList" +}) +public class SubInterface implements AAIDatum { + + @JsonProperty("interface-name") + private String interfaceName; + @JsonProperty("interface-role") + private String interfaceRole; + @JsonProperty("resource-version") + private String resourceVersion; + @JsonProperty("vlans") + private Vlans vlans; + @JsonProperty("relationshipList") + private RelationshipList relationshipList; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The interfaceName + */ + @JsonProperty("interface-name") + public String getInterfaceName() { + return interfaceName; + } + + /** + * + * @param interfaceName + * The interface-name + */ + @JsonProperty("interface-name") + public void setInterfaceName(String interfaceName) { + this.interfaceName = interfaceName; + } + + /** + * + * @return + * The interfaceRole + */ + @JsonProperty("interface-role") + public String getInterfaceRole() { + return interfaceRole; + } + + /** + * + * @param interfaceRole + * The interface-role + */ + @JsonProperty("interface-role") + public void setInterfaceRole(String interfaceRole) { + this.interfaceRole = interfaceRole; + } + + /** + * + * @return + * The resourceVersion + */ + @JsonProperty("resource-version") + public String getResourceVersion() { + return resourceVersion; + } + + /** + * + * @param resourceVersion + * The resource-version + */ + @JsonProperty("resource-version") + public void setResourceVersion(String resourceVersion) { + this.resourceVersion = resourceVersion; + } + + /** + * + * @return + * The vlans + */ + @JsonProperty("vlans") + public Vlans getVlans() { + return vlans; + } + + /** + * + * @param vlans + * The vlans + */ + @JsonProperty("vlans") + public void setVlans(Vlans vlans) { + this.vlans = vlans; + } + + /** + * + * @return + * The relationshipList + */ + @JsonProperty("relationshipList") + public RelationshipList getRelationshipList() { + return relationshipList; + } + + /** + * + * @param relationshipList + * The relationshipList + */ + @JsonProperty("relationshipList") + public void setRelationshipList(RelationshipList relationshipList) { + this.relationshipList = relationshipList; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/Variables.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/Variables.java new file mode 100644 index 00000000..99c42aa3 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/Variables.java @@ -0,0 +1,78 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.data; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "variable" +}) +public class Variables { + + @JsonProperty("variable") + private List variable = new ArrayList(); + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The variable + */ + @JsonProperty("variable") + public List getVariable() { + return variable; + } + + /** + * + * @param variable + * The variable + */ + @JsonProperty("variable") + public void setVariable(List variable) { + this.variable = variable; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/notify/KeyDatum.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/notify/KeyDatum.java new file mode 100644 index 00000000..80e633dd --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/notify/KeyDatum.java @@ -0,0 +1,99 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.data.notify; + +import java.util.HashMap; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "key-name", + "key-value" +}) +public class KeyDatum { + + @JsonProperty("key-name") + private String keyName; + @JsonProperty("key-value") + private String keyValue; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The keyName + */ + @JsonProperty("key-name") + public String getKeyName() { + return keyName; + } + + /** + * + * @param keyName + * The key-name + */ + @JsonProperty("key-name") + public void setKeyName(String keyName) { + this.keyName = keyName; + } + + /** + * + * @return + * The keyValue + */ + @JsonProperty("key-value") + public String getKeyValue() { + return keyValue; + } + + /** + * + * @param keyValue + * The key-value + */ + @JsonProperty("key-value") + public void setKeyValue(String keyValue) { + this.keyValue = keyValue; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/notify/NotifyEvent.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/notify/NotifyEvent.java new file mode 100644 index 00000000..1be171e0 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/notify/NotifyEvent.java @@ -0,0 +1,170 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.data.notify; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "event-id", + "event-trigger", + "key-data", + "node-type", + "selflink" +}) +public class NotifyEvent { + + @JsonProperty("event-id") + private String eventId; + @JsonProperty("event-trigger") + private String eventTrigger; + @JsonProperty("key-data") + private List keyData = new ArrayList(); + @JsonProperty("node-type") + private String nodeType; + @JsonProperty("selflink") + private String selflink; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The eventId + */ + @JsonProperty("event-id") + public String getEventId() { + return eventId; + } + + /** + * + * @param eventId + * The event-id + */ + @JsonProperty("event-id") + public void setEventId(String eventId) { + this.eventId = eventId; + } + + /** + * + * @return + * The eventTrigger + */ + @JsonProperty("event-trigger") + public String getEventTrigger() { + return eventTrigger; + } + + /** + * + * @param eventTrigger + * The event-trigger + */ + @JsonProperty("event-trigger") + public void setEventTrigger(String eventTrigger) { + this.eventTrigger = eventTrigger; + } + + /** + * + * @return + * The keyData + */ + @JsonProperty("key-data") + public List getKeyData() { + return keyData; + } + + /** + * + * @param keyData + * The key-data + */ + @JsonProperty("key-data") + public void setKeyData(List keyData) { + this.keyData = keyData; + } + + /** + * + * @return + * The nodeType + */ + @JsonProperty("node-type") + public String getNodeType() { + return nodeType; + } + + /** + * + * @param nodeType + * The node-type + */ + @JsonProperty("node-type") + public void setNodeType(String nodeType) { + this.nodeType = nodeType; + } + + /** + * + * @return + * The selflink + */ + @JsonProperty("selflink") + public String getSelflink() { + return selflink; + } + + /** + * + * @param selflink + * The selflink + */ + @JsonProperty("selflink") + public void setSelflink(String selflink) { + this.selflink = selflink; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/Flavor.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/Flavor.java new file mode 100644 index 00000000..69288c11 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/Flavor.java @@ -0,0 +1,122 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.data.v1507; + +import java.util.HashMap; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "flavorId", + "flavorName", + "flavorLink" +}) +public class Flavor { + + @JsonProperty("flavorId") + private String flavorId; + @JsonProperty("flavorName") + private String flavorName; + @JsonProperty("flavorLink") + private String flavorLink; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The flavorId + */ + @JsonProperty("flavorId") + public String getFlavorId() { + return flavorId; + } + + /** + * + * @param flavorId + * The flavorId + */ + @JsonProperty("flavorId") + public void setFlavorId(String flavorId) { + this.flavorId = flavorId; + } + + /** + * + * @return + * The flavorName + */ + @JsonProperty("flavorName") + public String getFlavorName() { + return flavorName; + } + + /** + * + * @param flavorName + * The flavorName + */ + @JsonProperty("flavorName") + public void setFlavorName(String flavorName) { + this.flavorName = flavorName; + } + + /** + * + * @return + * The flavorLink + */ + @JsonProperty("flavorLink") + public String getFlavorLink() { + return flavorLink; + } + + /** + * + * @param flavorLink + * The flavorLink + */ + @JsonProperty("flavorLink") + public void setFlavorLink(String flavorLink) { + this.flavorLink = flavorLink; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/Host.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/Host.java new file mode 100644 index 00000000..e4a5720a --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/Host.java @@ -0,0 +1,122 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.data.v1507; + +import java.util.HashMap; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "hostId", + "hostname", + "hostLoc" +}) +public class Host { + + @JsonProperty("hostId") + private String hostId; + @JsonProperty("hostname") + private String hostname; + @JsonProperty("hostLoc") + private String hostLoc; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The hostId + */ + @JsonProperty("hostId") + public String getHostId() { + return hostId; + } + + /** + * + * @param hostId + * The hostId + */ + @JsonProperty("hostId") + public void setHostId(String hostId) { + this.hostId = hostId; + } + + /** + * + * @return + * The hostname + */ + @JsonProperty("hostname") + public String getHostname() { + return hostname; + } + + /** + * + * @param hostname + * The hostname + */ + @JsonProperty("hostname") + public void setHostname(String hostname) { + this.hostname = hostname; + } + + /** + * + * @return + * The hostLoc + */ + @JsonProperty("hostLoc") + public String getHostLoc() { + return hostLoc; + } + + /** + * + * @param hostLoc + * The hostLoc + */ + @JsonProperty("hostLoc") + public void setHostLoc(String hostLoc) { + this.hostLoc = hostLoc; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/Image.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/Image.java new file mode 100644 index 00000000..19ae8749 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/Image.java @@ -0,0 +1,237 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.data.v1507; + +import java.util.HashMap; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "imageId", + "imageName", + "osType", + "osVersion", + "application", + "applicationVersion", + "applicationVendor", + "imageLink" +}) +public class Image { + + @JsonProperty("imageId") + private String imageId; + @JsonProperty("imageName") + private String imageName; + @JsonProperty("osType") + private String osType; + @JsonProperty("osVersion") + private String osVersion; + @JsonProperty("application") + private String application; + @JsonProperty("applicationVersion") + private String applicationVersion; + @JsonProperty("applicationVendor") + private String applicationVendor; + @JsonProperty("imageLink") + private String imageLink; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The imageId + */ + @JsonProperty("imageId") + public String getImageId() { + return imageId; + } + + /** + * + * @param imageId + * The imageId + */ + @JsonProperty("imageId") + public void setImageId(String imageId) { + this.imageId = imageId; + } + + /** + * + * @return + * The imageName + */ + @JsonProperty("imageName") + public String getImageName() { + return imageName; + } + + /** + * + * @param imageName + * The imageName + */ + @JsonProperty("imageName") + public void setImageName(String imageName) { + this.imageName = imageName; + } + + /** + * + * @return + * The osType + */ + @JsonProperty("osType") + public String getOsType() { + return osType; + } + + /** + * + * @param osType + * The osType + */ + @JsonProperty("osType") + public void setOsType(String osType) { + this.osType = osType; + } + + /** + * + * @return + * The osVersion + */ + @JsonProperty("osVersion") + public String getOsVersion() { + return osVersion; + } + + /** + * + * @param osVersion + * The osVersion + */ + @JsonProperty("osVersion") + public void setOsVersion(String osVersion) { + this.osVersion = osVersion; + } + + /** + * + * @return + * The application + */ + @JsonProperty("application") + public String getApplication() { + return application; + } + + /** + * + * @param application + * The application + */ + @JsonProperty("application") + public void setApplication(String application) { + this.application = application; + } + + /** + * + * @return + * The applicationVersion + */ + @JsonProperty("applicationVersion") + public String getApplicationVersion() { + return applicationVersion; + } + + /** + * + * @param applicationVersion + * The applicationVersion + */ + @JsonProperty("applicationVersion") + public void setApplicationVersion(String applicationVersion) { + this.applicationVersion = applicationVersion; + } + + /** + * + * @return + * The applicationVendor + */ + @JsonProperty("applicationVendor") + public String getApplicationVendor() { + return applicationVendor; + } + + /** + * + * @param applicationVendor + * The applicationVendor + */ + @JsonProperty("applicationVendor") + public void setApplicationVendor(String applicationVendor) { + this.applicationVendor = applicationVendor; + } + + /** + * + * @return + * The imageLink + */ + @JsonProperty("imageLink") + public String getImageLink() { + return imageLink; + } + + /** + * + * @param imageLink + * The imageLink + */ + @JsonProperty("imageLink") + public void setImageLink(String imageLink) { + this.imageLink = imageLink; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/IpAddress.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/IpAddress.java new file mode 100644 index 00000000..1d29857a --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/IpAddress.java @@ -0,0 +1,168 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.data.v1507; + +import java.util.HashMap; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "addrId", + "addr", + "version", + "type", + "networkName" +}) +public class IpAddress { + + @JsonProperty("addrId") + private String addrId; + @JsonProperty("addr") + private String addr; + @JsonProperty("version") + private String version; + @JsonProperty("type") + private String type; + @JsonProperty("networkName") + private String networkName; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The addrId + */ + @JsonProperty("addrId") + public String getAddrId() { + return addrId; + } + + /** + * + * @param addrId + * The addrId + */ + @JsonProperty("addrId") + public void setAddrId(String addrId) { + this.addrId = addrId; + } + + /** + * + * @return + * The addr + */ + @JsonProperty("addr") + public String getAddr() { + return addr; + } + + /** + * + * @param addr + * The addr + */ + @JsonProperty("addr") + public void setAddr(String addr) { + this.addr = addr; + } + + /** + * + * @return + * The version + */ + @JsonProperty("version") + public String getVersion() { + return version; + } + + /** + * + * @param version + * The version + */ + @JsonProperty("version") + public void setVersion(String version) { + this.version = version; + } + + /** + * + * @return + * The type + */ + @JsonProperty("type") + public String getType() { + return type; + } + + /** + * + * @param type + * The type + */ + @JsonProperty("type") + public void setType(String type) { + this.type = type; + } + + /** + * + * @return + * The networkName + */ + @JsonProperty("networkName") + public String getNetworkName() { + return networkName; + } + + /** + * + * @param networkName + * The networkName + */ + @JsonProperty("networkName") + public void setNetworkName(String networkName) { + this.networkName = networkName; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/Relationship.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/Relationship.java new file mode 100644 index 00000000..623bd722 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/Relationship.java @@ -0,0 +1,147 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.data.v1507; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "relatedTo", + "relatedLink", + "relationshipData", + "any" +}) +public class Relationship { + + @JsonProperty("relatedTo") + private String relatedTo; + @JsonProperty("relatedLink") + private String relatedLink; + @JsonProperty("relationshipData") + private List relationshipData = new ArrayList(); + @JsonProperty("any") + private List any = new ArrayList(); + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The relatedTo + */ + @JsonProperty("relatedTo") + public String getRelatedTo() { + return relatedTo; + } + + /** + * + * @param relatedTo + * The relatedTo + */ + @JsonProperty("relatedTo") + public void setRelatedTo(String relatedTo) { + this.relatedTo = relatedTo; + } + + /** + * + * @return + * The relatedLink + */ + @JsonProperty("relatedLink") + public String getRelatedLink() { + return relatedLink; + } + + /** + * + * @param relatedLink + * The relatedLink + */ + @JsonProperty("relatedLink") + public void setRelatedLink(String relatedLink) { + this.relatedLink = relatedLink; + } + + /** + * + * @return + * The relationshipData + */ + @JsonProperty("relationshipData") + public List getRelationshipData() { + return relationshipData; + } + + /** + * + * @param relationshipData + * The relationshipData + */ + @JsonProperty("relationshipData") + public void setRelationshipData(List relationshipData) { + this.relationshipData = relationshipData; + } + + /** + * + * @return + * The any + */ + @JsonProperty("any") + public List getAny() { + return any; + } + + /** + * + * @param any + * The any + */ + @JsonProperty("any") + public void setAny(List any) { + this.any = any; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/RelationshipDatum.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/RelationshipDatum.java new file mode 100644 index 00000000..9f44c1fa --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/RelationshipDatum.java @@ -0,0 +1,124 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.data.v1507; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "relationshipKey", + "relationshipValue", + "any" +}) +public class RelationshipDatum { + + @JsonProperty("relationshipKey") + private String relationshipKey; + @JsonProperty("relationshipValue") + private String relationshipValue; + @JsonProperty("any") + private List any = new ArrayList(); + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The relationshipKey + */ + @JsonProperty("relationshipKey") + public String getRelationshipKey() { + return relationshipKey; + } + + /** + * + * @param relationshipKey + * The relationshipKey + */ + @JsonProperty("relationshipKey") + public void setRelationshipKey(String relationshipKey) { + this.relationshipKey = relationshipKey; + } + + /** + * + * @return + * The relationshipValue + */ + @JsonProperty("relationshipValue") + public String getRelationshipValue() { + return relationshipValue; + } + + /** + * + * @param relationshipValue + * The relationshipValue + */ + @JsonProperty("relationshipValue") + public void setRelationshipValue(String relationshipValue) { + this.relationshipValue = relationshipValue; + } + + /** + * + * @return + * The any + */ + @JsonProperty("any") + public List getAny() { + return any; + } + + /** + * + * @param any + * The any + */ + @JsonProperty("any") + public void setAny(List any) { + this.any = any; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/RelationshipList.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/RelationshipList.java new file mode 100644 index 00000000..242b0911 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/RelationshipList.java @@ -0,0 +1,101 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.data.v1507; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "relationship", + "any" +}) +public class RelationshipList { + + @JsonProperty("relationship") + private List relationship = new ArrayList(); + @JsonProperty("any") + private List any = new ArrayList(); + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The relationship + */ + @JsonProperty("relationship") + public List getRelationship() { + return relationship; + } + + /** + * + * @param relationship + * The relationship + */ + @JsonProperty("relationship") + public void setRelationship(List relationship) { + this.relationship = relationship; + } + + /** + * + * @return + * The any + */ + @JsonProperty("any") + public List getAny() { + return any; + } + + /** + * + * @param any + * The any + */ + @JsonProperty("any") + public void setAny(List any) { + this.any = any; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/VServer.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/VServer.java new file mode 100644 index 00000000..6c975604 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/data/v1507/VServer.java @@ -0,0 +1,262 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.data.v1507; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "vmId", + "vmName", + "vmName2", + "host", + "image", + "flavor", + "ipAddresses", + "vserverLink", + "relationshipList" +}) +public class VServer { + + @JsonProperty("vmId") + private String vmId; + @JsonProperty("vmName") + private String vmName; + @JsonProperty("vmName2") + private String vmName2; + @JsonProperty("host") + private Host host; + @JsonProperty("image") + private Image image; + @JsonProperty("flavor") + private Flavor flavor; + @JsonProperty("ipAddresses") + private List ipAddresses = new ArrayList(); + @JsonProperty("vserverLink") + private String vserverLink; + @JsonProperty("relationshipList") + private RelationshipList relationshipList; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The vmId + */ + @JsonProperty("vmId") + public String getVmId() { + return vmId; + } + + /** + * + * @param vmId + * The vmId + */ + @JsonProperty("vmId") + public void setVmId(String vmId) { + this.vmId = vmId; + } + + /** + * + * @return + * The vmName + */ + @JsonProperty("vmName") + public String getVmName() { + return vmName; + } + + /** + * + * @param vmName + * The vmName + */ + @JsonProperty("vmName") + public void setVmName(String vmName) { + this.vmName = vmName; + } + + /** + * + * @return + * The vmName2 + */ + @JsonProperty("vmName2") + public String getVmName2() { + return vmName2; + } + + /** + * + * @param vmName2 + * The vmName2 + */ + @JsonProperty("vmName2") + public void setVmName2(String vmName2) { + this.vmName2 = vmName2; + } + + /** + * + * @return + * The host + */ + @JsonProperty("host") + public Host getHost() { + return host; + } + + /** + * + * @param host + * The host + */ + @JsonProperty("host") + public void setHost(Host host) { + this.host = host; + } + + /** + * + * @return + * The image + */ + @JsonProperty("image") + public Image getImage() { + return image; + } + + /** + * + * @param image + * The image + */ + @JsonProperty("image") + public void setImage(Image image) { + this.image = image; + } + + /** + * + * @return + * The flavor + */ + @JsonProperty("flavor") + public Flavor getFlavor() { + return flavor; + } + + /** + * + * @param flavor + * The flavor + */ + @JsonProperty("flavor") + public void setFlavor(Flavor flavor) { + this.flavor = flavor; + } + + /** + * + * @return + * The ipAddresses + */ + @JsonProperty("ipAddresses") + public List getIpAddresses() { + return ipAddresses; + } + + /** + * + * @param ipAddresses + * The ipAddresses + */ + @JsonProperty("ipAddresses") + public void setIpAddresses(List ipAddresses) { + this.ipAddresses = ipAddresses; + } + + /** + * + * @return + * The vserverLink + */ + @JsonProperty("vserverLink") + public String getVserverLink() { + return vserverLink; + } + + /** + * + * @param vserverLink + * The vserverLink + */ + @JsonProperty("vserverLink") + public void setVserverLink(String vserverLink) { + this.vserverLink = vserverLink; + } + + /** + * + * @return + * The relationshipList + */ + @JsonProperty("relationshipList") + public RelationshipList getRelationshipList() { + return relationshipList; + } + + /** + * + * @param relationshipList + * The relationshipList + */ + @JsonProperty("relationshipList") + public void setRelationshipList(RelationshipList relationshipList) { + this.relationshipList = relationshipList; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/FormattedQueryRequestData.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/FormattedQueryRequestData.java new file mode 100644 index 00000000..78d890aa --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/FormattedQueryRequestData.java @@ -0,0 +1,83 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.query; + +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + +import org.openecomp.sdnc.sli.aai.data.AAIDatum; + +import com.fasterxml.jackson.annotation.JsonProperty; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "start", + "query" +}) +@XmlRootElement(name = "query-request") +public class FormattedQueryRequestData implements AAIDatum { + + @JsonProperty("start") + protected List start; + + @JsonProperty("query") + private String query; + + @JsonProperty("start") + public List getStart () + { + return start; + } + + @JsonProperty("start") + public void setStart (List start) + { + this.start = start; + } + + @JsonProperty("query") + public String getQuery () + { + return query; + } + + @JsonProperty("query") + public void setQuery (String query) + { + this.query = query; + } + + @Override + public String toString() + { + return " [start = "+start+", query = "+query+"]"; + } + + public String getResourceVersion() { + return null; + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/FormattedQueryResultList.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/FormattedQueryResultList.java new file mode 100644 index 00000000..48b2a60b --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/FormattedQueryResultList.java @@ -0,0 +1,59 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.query; + +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + +import org.openecomp.sdnc.sli.aai.data.AAIDatum; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "results" +}) +@XmlRootElement(name = "result-list") +public class FormattedQueryResultList implements AAIDatum { + + @XmlElement(name = "results") + private List results; + @XmlElement(name = "results") + public List getResults () + { + return results; + } + @XmlElement(name = "results") + public void setResults (List results) + { + this.results = results; + } + + @Override + public String toString() + { + return "ClassPojo [results = "+results+"]"; + } +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/InstanceFilter.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/InstanceFilter.java new file mode 100644 index 00000000..33f1fec2 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/InstanceFilter.java @@ -0,0 +1,133 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.query; + +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.Generated; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +import org.openecomp.aai.inventory.v10.L3Network; +import org.openecomp.aai.inventory.v10.Pnf; +import org.openecomp.aai.inventory.v10.LogicalLink; +import org.openecomp.aai.inventory.v10.ServiceInstance; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "logical-link", + "pnf", + "l3-network", + "service-instance" +}) +public class InstanceFilter { + + @JsonProperty("logical-link") + private LogicalLink logicalLink; + @JsonProperty("pnf") + private Pnf pnf; + @JsonProperty("l3-network") + private L3Network l3Network; + @JsonProperty("service-instance") + private ServiceInstance serviceInstance; + + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The logicalLink + */ + @JsonProperty("logical-link") + public LogicalLink getLogicalLink() { + return logicalLink; + } + + /** + * + * @param logicalLink + * The logical-link + */ + @JsonProperty("logical-link") + public void setLogicalLink(LogicalLink logicalLink) { + this.logicalLink = logicalLink; + } + + /** + * + * @return + * The pnf + */ + @JsonProperty("pnf") + public Pnf getPnf() { + return pnf; + } + + /** + * + * @param pnf + * The pnf + */ + @JsonProperty("pnf") + public void setPnf(Pnf pnf) { + this.pnf = pnf; + } + + @JsonProperty("l3-network") + public L3Network getL3Network() { + return l3Network; + } + + @JsonProperty("l3-network") + public void setL3Network(L3Network l3Network) { + this.l3Network = l3Network; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + @JsonProperty("service-instance") + public ServiceInstance getServiceInstance() { + return serviceInstance; + } + + @JsonProperty("service-instance") + public void setServiceInstance(ServiceInstance serviceInstance) { + this.serviceInstance = serviceInstance; + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/InstanceFilters.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/InstanceFilters.java new file mode 100644 index 00000000..d38beed0 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/InstanceFilters.java @@ -0,0 +1,78 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.query; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "instance-filter" +}) +public class InstanceFilters { + + @JsonProperty("instance-filter") + private List instanceFilter = new ArrayList(); + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The instanceFilter + */ + @JsonProperty("instance-filter") + public List getInstanceFilter() { + return instanceFilter; + } + + /** + * + * @param instanceFilter + * The instance-filter + */ + @JsonProperty("instance-filter") + public void setInstanceFilter(List instanceFilter) { + this.instanceFilter = instanceFilter; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/NamedQuery.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/NamedQuery.java new file mode 100644 index 00000000..5b20903d --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/NamedQuery.java @@ -0,0 +1,76 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.query; + +import java.util.HashMap; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "named-query-uuid" +}) +public class NamedQuery { + + @JsonProperty("named-query-uuid") + private String namedQueryUuid; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The namedQueryUuid + */ + @JsonProperty("named-query-uuid") + public String getNamedQueryUuid() { + return namedQueryUuid; + } + + /** + * + * @param namedQueryUuid + * The named-query-uuid + */ + @JsonProperty("named-query-uuid") + public void setNamedQueryUuid(String namedQueryUuid) { + this.namedQueryUuid = namedQueryUuid; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/NamedQueryData.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/NamedQueryData.java new file mode 100644 index 00000000..e8a77529 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/NamedQueryData.java @@ -0,0 +1,101 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.query; + +import java.util.HashMap; +import java.util.Map; +import javax.annotation.Generated; + +import org.openecomp.sdnc.sli.aai.data.AAIDatum; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "query-parameters", + "instance-filters" +}) +public class NamedQueryData implements AAIDatum { + + @JsonProperty("query-parameters") + private QueryParameters queryParameters; + @JsonProperty("instance-filters") + private InstanceFilters instanceFilters; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The queryParameters + */ + @JsonProperty("query-parameters") + public QueryParameters getQueryParameters() { + return queryParameters; + } + + /** + * + * @param queryParameters + * The query-parameters + */ + @JsonProperty("query-parameters") + public void setQueryParameters(QueryParameters queryParameters) { + this.queryParameters = queryParameters; + } + + /** + * + * @return + * The instanceFilters + */ + @JsonProperty("instance-filters") + public InstanceFilters getInstanceFilters() { + return instanceFilters; + } + + /** + * + * @param instanceFilters + * The instance-filters + */ + @JsonProperty("instance-filters") + public void setInstanceFilters(InstanceFilters instanceFilters) { + this.instanceFilters = instanceFilters; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/QueryParameters.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/QueryParameters.java new file mode 100644 index 00000000..bb4498cf --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/QueryParameters.java @@ -0,0 +1,76 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.query; + +import java.util.HashMap; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "named-query" +}) +public class QueryParameters { + + @JsonProperty("named-query") + private NamedQuery namedQuery; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The namedQuery + */ + @JsonProperty("named-query") + public NamedQuery getNamedQuery() { + return namedQuery; + } + + /** + * + * @param namedQuery + * The named-query + */ + @JsonProperty("named-query") + public void setNamedQuery(NamedQuery namedQuery) { + this.namedQuery = namedQuery; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/Results.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/Results.java new file mode 100644 index 00000000..2931a7e1 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/query/Results.java @@ -0,0 +1,84 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.query; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + +import org.openecomp.aai.inventory.v10.*; + + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "genericVnf", + "pserver", + "complex" +}) +@XmlRootElement(name = "results") +public class Results { + + @XmlElement(name = "generic-vnf") + private GenericVnf genericVnf; + + @XmlElement(name = "complex") + private Complex complex; + + @XmlElement(name = "pserver") + private Pserver pserver; + + + @XmlElement(name = "generic-vnf") + public GenericVnf getGenericVnf () + { + return genericVnf; + } + @XmlElement(name = "generic-vnf") + public void setGenericVnf (GenericVnf genericVnf) + { + this.genericVnf = genericVnf; + } + + @Override + public String toString() + { + return " [generic-vnf = "+genericVnf+"]"; + } + @XmlElement(name = "complex") + public Complex getComplex() { + return complex; + } + @XmlElement(name = "complex") + public void setComplex(Complex complex) { + this.complex = complex; + } + @XmlElement(name = "pserver") + public Pserver getPserver() { + return pserver; + } + @XmlElement(name = "pserver") + public void setPserver(Pserver pserver) { + this.pserver = pserver; + } +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/update/Action.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/update/Action.java new file mode 100644 index 00000000..296a3713 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/update/Action.java @@ -0,0 +1,101 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.update; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "action-data", + "action-type" +}) +public class Action { + + @JsonProperty("action-data") + private List actionData = new ArrayList(); + @JsonProperty("action-type") + private String actionType; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The actionData + */ + @JsonProperty("action-data") + public List getActionData() { + return actionData; + } + + /** + * + * @param actionData + * The action-data + */ + @JsonProperty("action-data") + public void setActionData(List actionData) { + this.actionData = actionData; + } + + /** + * + * @return + * The actionType + */ + @JsonProperty("action-type") + public String getActionType() { + return actionType; + } + + /** + * + * @param actionType + * The action-type + */ + @JsonProperty("action-type") + public void setActionType(String actionType) { + this.actionType = actionType; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/update/ActionDatum.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/update/ActionDatum.java new file mode 100644 index 00000000..3dfb9c37 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/update/ActionDatum.java @@ -0,0 +1,99 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.update; + +import java.util.HashMap; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "property-name", + "property-value" +}) +public class ActionDatum { + + @JsonProperty("property-name") + private String propertyName; + @JsonProperty("property-value") + private String propertyValue; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The propertyName + */ + @JsonProperty("property-name") + public String getPropertyName() { + return propertyName; + } + + /** + * + * @param propertyName + * The property-name + */ + @JsonProperty("property-name") + public void setPropertyName(String propertyName) { + this.propertyName = propertyName; + } + + /** + * + * @return + * The propertyValue + */ + @JsonProperty("property-value") + public String getPropertyValue() { + return propertyValue; + } + + /** + * + * @param propertyValue + * The property-value + */ + @JsonProperty("property-value") + public void setPropertyValue(String propertyValue) { + this.propertyValue = propertyValue; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/update/Update.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/update/Update.java new file mode 100644 index 00000000..a092b6b9 --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/update/Update.java @@ -0,0 +1,124 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.update; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "update-node-type", + "update-node-key", + "action" +}) +public class Update { + + @JsonProperty("update-node-type") + private String updateNodeType; + @JsonProperty("action") + private List action = new ArrayList(); + @JsonProperty("update-node-key") + private List updateNodeKey = new ArrayList(); + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The updateNodeType + */ + @JsonProperty("update-node-type") + public String getUpdateNodeType() { + return updateNodeType; + } + + /** + * + * @param updateNodeType + * The update-node-type + */ + @JsonProperty("update-node-type") + public void setUpdateNodeType(String updateNodeType) { + this.updateNodeType = updateNodeType; + } + + /** + * + * @return + * The action + */ + @JsonProperty("action") + public List getAction() { + return action; + } + + /** + * + * @param action + * The action + */ + @JsonProperty("action") + public void setAction(List action) { + this.action = action; + } + + /** + * + * @return + * The updateNodeKey + */ + @JsonProperty("update-node-key") + public List getUpdateNodeKey() { + return updateNodeKey; + } + + /** + * + * @param updateNodeKey + * The update-node-key + */ + @JsonProperty("update-node-key") + public void setUpdateNodeKey(List updateNodeKey) { + this.updateNodeKey = updateNodeKey; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/update/UpdateNodeKey.java b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/update/UpdateNodeKey.java new file mode 100644 index 00000000..ffc5cc0d --- /dev/null +++ b/aai-service/provider/src/main/java/org/openecomp/sdnc/sli/aai/update/UpdateNodeKey.java @@ -0,0 +1,99 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.update; + +import java.util.HashMap; +import java.util.Map; +import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Generated("org.jsonschema2pojo") +@JsonPropertyOrder({ + "key-name", + "key-value" +}) +public class UpdateNodeKey { + + @JsonProperty("key-name") + private String keyName; + @JsonProperty("key-value") + private String keyValue; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + /** + * + * @return + * The keyName + */ + @JsonProperty("key-name") + public String getKeyName() { + return keyName; + } + + /** + * + * @param keyName + * The key-name + */ + @JsonProperty("key-name") + public void setKeyName(String keyName) { + this.keyName = keyName; + } + + /** + * + * @return + * The keyValue + */ + @JsonProperty("key-value") + public String getKeyValue() { + return keyValue; + } + + /** + * + * @param keyValue + * The key-value + */ + @JsonProperty("key-value") + public void setKeyValue(String keyValue) { + this.keyValue = keyValue; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + +} diff --git a/aai-service/provider/src/main/resources/aai-path.properties b/aai-service/provider/src/main/resources/aai-path.properties new file mode 100644 index 00000000..bb42ea07 --- /dev/null +++ b/aai-service/provider/src/main/resources/aai-path.properties @@ -0,0 +1,189 @@ +### +# ============LICENSE_START======================================================= +# openECOMP : SDN-C +# ================================================================================ +# Copyright (C) 2017 ONAP 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========================================================= +### + +complex|ctag-pool = /aai/v10/cloud-infrastructure/complexes/complex/{physical-location-id}/ctag-pools/ctag-pool/{target-pe}/{availability-zone-name} +complex = /aai/v10/cloud-infrastructure/complexes/complex/{physical-location-id} +cloud-region|volume-group = /aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/volume-groups/volume-group/{volume-group-id} +cloud-region|tenant|vserver|volume = /aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/tenants/tenant/{tenant-id}/vservers/vserver/{vserver-id}/volumes/volume/{volume-id} +cloud-region|tenant|vserver|l-interface|vlan|l3-interface-ipv4-address-list = /aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/tenants/tenant/{tenant-id}/vservers/vserver/{vserver-id}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +cloud-region|tenant|vserver|l-interface|vlan|l3-interface-ipv6-address-list = /aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/tenants/tenant/{tenant-id}/vservers/vserver/{vserver-id}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +cloud-region|tenant|vserver|l-interface|vlan = /aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/tenants/tenant/{tenant-id}/vservers/vserver/{vserver-id}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface} +cloud-region|tenant|vserver|l-interface|sriov-vf = /aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/tenants/tenant/{tenant-id}/vservers/vserver/{vserver-id}/l-interfaces/l-interface/{interface-name}/sriov-vfs/sriov-vf/{pci-id} +cloud-region|tenant|vserver|l-interface|l3-interface-ipv4-address-list = /aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/tenants/tenant/{tenant-id}/vservers/vserver/{vserver-id}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +cloud-region|tenant|vserver|l-interface|l3-interface-ipv6-address-list = /aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/tenants/tenant/{tenant-id}/vservers/vserver/{vserver-id}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +cloud-region|tenant|vserver|l-interface = /aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/tenants/tenant/{tenant-id}/vservers/vserver/{vserver-id}/l-interfaces/l-interface/{interface-name} +cloud-region|tenant|vserver = /aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/tenants/tenant/{tenant-id}/vservers/vserver/{vserver-id} +cloud-region|tenant = /aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/tenants/tenant/{tenant-id} +cloud-region|flavor = /aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/flavors/flavor/{flavor-id} +cloud-region|group-assignment = /aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/group-assignments/group-assignment/{group-id} +cloud-region|snapshot = /aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/snapshots/snapshot/{snapshot-id} +cloud-region|image|metadatum = /aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/images/image/{image-id}/metadata/metadatum/{metaname} +cloud-region|image = /aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/images/image/{image-id} +cloud-region|dvs-switch = /aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/dvs-switches/dvs-switch/{switch-name} +cloud-region|oam-network = /aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/oam-networks/oam-network/{network-uuid} +cloud-region|availability-zone = /aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/availability-zones/availability-zone/{availability-zone-name} +cloud-region = /aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id} +network-profile = /aai/v10/cloud-infrastructure/network-profiles/network-profile/{nm-profile-name} +pserver|p-interface|l-interface|vlan|l3-interface-ipv4-address-list = /aai/v10/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +pserver|p-interface|l-interface|vlan|l3-interface-ipv6-address-list = /aai/v10/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +pserver|p-interface|l-interface|vlan = /aai/v10/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface} +pserver|p-interface|l-interface|sriov-vf = /aai/v10/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/sriov-vfs/sriov-vf/{pci-id} +pserver|p-interface|l-interface|l3-interface-ipv4-address-list = /aai/v10/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +pserver|p-interface|l-interface|l3-interface-ipv6-address-list = /aai/v10/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +pserver|p-interface|l-interface = /aai/v10/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name} +pserver|p-interface = /aai/v10/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces/p-interface/{interface-name} +pserver|lag-interface|l-interface|vlan|l3-interface-ipv4-address-list = /aai/v10/cloud-infrastructure/pservers/pserver/{hostname}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +pserver|lag-interface|l-interface|vlan|l3-interface-ipv6-address-list = /aai/v10/cloud-infrastructure/pservers/pserver/{hostname}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +pserver|lag-interface|l-interface|vlan = /aai/v10/cloud-infrastructure/pservers/pserver/{hostname}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface} +pserver|lag-interface|l-interface|sriov-vf = /aai/v10/cloud-infrastructure/pservers/pserver/{hostname}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/sriov-vfs/sriov-vf/{pci-id} +pserver|lag-interface|l-interface|l3-interface-ipv4-address-list = /aai/v10/cloud-infrastructure/pservers/pserver/{hostname}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +pserver|lag-interface|l-interface|l3-interface-ipv6-address-list = /aai/v10/cloud-infrastructure/pservers/pserver/{hostname}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +pserver|lag-interface|l-interface = /aai/v10/cloud-infrastructure/pservers/pserver/{hostname}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name} +pserver|lag-interface = /aai/v10/cloud-infrastructure/pservers/pserver/{hostname}/lag-interfaces/lag-interface/{interface-name} +pserver = /aai/v10/cloud-infrastructure/pservers/pserver/{hostname} +virtual-data-center = /aai/v10/cloud-infrastructure/virtual-data-centers/virtual-data-center/{vdc-id} +connector|metadatum = /aai/v10/business/connectors/connector/{resource-instance-id}/metadata/metadatum/{metaname} +connector = /aai/v10/business/connectors/connector/{resource-instance-id} +customer|service-subscription|service-instance|metadatum = /aai/v10/business/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances/service-instance/{service-instance-id}/metadata/metadatum/{metaname} +customer|service-subscription|service-instance|allotted-resource|tunnel-xconnect = /aai/v10/business/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances/service-instance/{service-instance-id}/allotted-resources/allotted-resource/{id}/tunnel-xconnects/tunnel-xconnect/{id} +customer|service-subscription|service-instance|allotted-resource = /aai/v10/business/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances/service-instance/{service-instance-id}/allotted-resources/allotted-resource/{id} +customer|service-subscription|service-instance = /aai/v10/business/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances/service-instance/{service-instance-id} +customer|service-subscription = /aai/v10/business/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type} +customer = /aai/v10/business/customers/customer/{global-customer-id} +vnf-image = /aai/v10/service-design-and-creation/vnf-images/vnf-image/{att-uuid} +service = /aai/v10/service-design-and-creation/services/service/{service-id} +service-capability = /aai/v10/service-design-and-creation/service-capabilities/service-capability/{service-type}/{vnf-type} +model|model-ver|model-element|model-constraint|constrained-element-set|element-choice-set = /aai/v10/service-design-and-creation/models/model/{model-invariant-id}/model-vers/model-ver/{model-version-id}/model-elements/model-element/{model-element-uuid}/model-constraints/model-constraint/{model-constraint-uuid}/constrained-element-sets/constrained-element-set/{constrained-element-set-uuid}/element-choice-sets/element-choice-set/{element-choice-set-uuid} +model|model-ver|model-element|model-constraint|constrained-element-set = /aai/v10/service-design-and-creation/models/model/{model-invariant-id}/model-vers/model-ver/{model-version-id}/model-elements/model-element/{model-element-uuid}/model-constraints/model-constraint/{model-constraint-uuid}/constrained-element-sets/constrained-element-set/{constrained-element-set-uuid} +model|model-ver|model-element|model-constraint = /aai/v10/service-design-and-creation/models/model/{model-invariant-id}/model-vers/model-ver/{model-version-id}/model-elements/model-element/{model-element-uuid}/model-constraints/model-constraint/{model-constraint-uuid} +model|model-ver|model-element = /aai/v10/service-design-and-creation/models/model/{model-invariant-id}/model-vers/model-ver/{model-version-id}/model-elements/model-element/{model-element-uuid} +model|model-ver|metadatum = /aai/v10/service-design-and-creation/models/model/{model-invariant-id}/model-vers/model-ver/{model-version-id}/metadata/metadatum/{metaname} +model|model-ver = /aai/v10/service-design-and-creation/models/model/{model-invariant-id}/model-vers/model-ver/{model-version-id} +model = /aai/v10/service-design-and-creation/models/model/{model-invariant-id} +named-query|named-query-element|related-lookup = /aai/v10/service-design-and-creation/named-queries/named-query/{named-query-uuid}/named-query-elements/named-query-element/{named-query-element-uuid}/related-lookups/related-lookup/{related-lookup-uuid} +named-query|named-query-element|property-constraint = /aai/v10/service-design-and-creation/named-queries/named-query/{named-query-uuid}/named-query-elements/named-query-element/{named-query-element-uuid}/property-constraints/property-constraint/{property-constraint-uuid} +named-query|named-query-element = /aai/v10/service-design-and-creation/named-queries/named-query/{named-query-uuid}/named-query-elements/named-query-element/{named-query-element-uuid} +named-query = /aai/v10/service-design-and-creation/named-queries/named-query/{named-query-uuid} +logical-link = /aai/v10/network/logical-links/logical-link/{link-name} +site-pair-set|routing-instance|site-pair|class-of-service = /aai/v10/network/site-pair-sets/site-pair-set/{site-pair-set-id}/routing-instances/routing-instance/{routing-instance-id}/site-pairs/site-pair/{site-pair-id}/classes-of-service/class-of-service/{cos} +site-pair-set|routing-instance|site-pair = /aai/v10/network/site-pair-sets/site-pair-set/{site-pair-set-id}/routing-instances/routing-instance/{routing-instance-id}/site-pairs/site-pair/{site-pair-id} +site-pair-set|routing-instance = /aai/v10/network/site-pair-sets/site-pair-set/{site-pair-set-id}/routing-instances/routing-instance/{routing-instance-id} +site-pair-set = /aai/v10/network/site-pair-sets/site-pair-set/{site-pair-set-id} +vpn-binding|route-target = /aai/v10/network/vpn-bindings/vpn-binding/{vpn-id}/route-targets/route-target/{global-route-target}/{route-target-role} +vpn-binding = /aai/v10/network/vpn-bindings/vpn-binding/{vpn-id} +vpls-pe|p-interface|l-interface|vlan|l3-interface-ipv4-address-list = /aai/v10/network/vpls-pes/vpls-pe/{equipment-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +vpls-pe|p-interface|l-interface|vlan|l3-interface-ipv6-address-list = /aai/v10/network/vpls-pes/vpls-pe/{equipment-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +vpls-pe|p-interface|l-interface|vlan = /aai/v10/network/vpls-pes/vpls-pe/{equipment-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface} +vpls-pe|p-interface|l-interface|sriov-vf = /aai/v10/network/vpls-pes/vpls-pe/{equipment-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/sriov-vfs/sriov-vf/{pci-id} +vpls-pe|p-interface|l-interface|l3-interface-ipv4-address-list = /aai/v10/network/vpls-pes/vpls-pe/{equipment-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +vpls-pe|p-interface|l-interface|l3-interface-ipv6-address-list = /aai/v10/network/vpls-pes/vpls-pe/{equipment-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +vpls-pe|p-interface|l-interface = /aai/v10/network/vpls-pes/vpls-pe/{equipment-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name} +vpls-pe|p-interface = /aai/v10/network/vpls-pes/vpls-pe/{equipment-name}/p-interfaces/p-interface/{interface-name} +vpls-pe|lag-interface|l-interface|vlan|l3-interface-ipv4-address-list = /aai/v10/network/vpls-pes/vpls-pe/{equipment-name}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +vpls-pe|lag-interface|l-interface|vlan|l3-interface-ipv6-address-list = /aai/v10/network/vpls-pes/vpls-pe/{equipment-name}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +vpls-pe|lag-interface|l-interface|vlan = /aai/v10/network/vpls-pes/vpls-pe/{equipment-name}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface} +vpls-pe|lag-interface|l-interface|sriov-vf = /aai/v10/network/vpls-pes/vpls-pe/{equipment-name}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/sriov-vfs/sriov-vf/{pci-id} +vpls-pe|lag-interface|l-interface|l3-interface-ipv4-address-list = /aai/v10/network/vpls-pes/vpls-pe/{equipment-name}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +vpls-pe|lag-interface|l-interface|l3-interface-ipv6-address-list = /aai/v10/network/vpls-pes/vpls-pe/{equipment-name}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +vpls-pe|lag-interface|l-interface = /aai/v10/network/vpls-pes/vpls-pe/{equipment-name}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name} +vpls-pe|lag-interface = /aai/v10/network/vpls-pes/vpls-pe/{equipment-name}/lag-interfaces/lag-interface/{interface-name} +vpls-pe = /aai/v10/network/vpls-pes/vpls-pe/{equipment-name} +multicast-configuration = /aai/v10/network/multicast-configurations/multicast-configuration/{multicast-configuration-id} +vce|port-group|cvlan-tag-entry = /aai/v10/network/vces/vce/{vnf-id}/port-groups/port-group/{interface-id}/cvlan-tags/cvlan-tag-entry/{cvlan-tag} +vce|port-group = /aai/v10/network/vces/vce/{vnf-id}/port-groups/port-group/{interface-id} +vce|license = /aai/v10/network/vces/vce/{vnf-id}/licenses/license/{group-uuid}/{resource-uuid} +vce|entitlement = /aai/v10/network/vces/vce/{vnf-id}/entitlements/entitlement/{group-uuid}/{resource-uuid} +vce = /aai/v10/network/vces/vce/{vnf-id} +vpe|l-interface|vlan|l3-interface-ipv4-address-list = /aai/v10/network/vpes/vpe/{vnf-id}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +vpe|l-interface|vlan|l3-interface-ipv6-address-list = /aai/v10/network/vpes/vpe/{vnf-id}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +vpe|l-interface|vlan = /aai/v10/network/vpes/vpe/{vnf-id}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface} +vpe|l-interface|sriov-vf = /aai/v10/network/vpes/vpe/{vnf-id}/l-interfaces/l-interface/{interface-name}/sriov-vfs/sriov-vf/{pci-id} +vpe|l-interface|l3-interface-ipv4-address-list = /aai/v10/network/vpes/vpe/{vnf-id}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +vpe|l-interface|l3-interface-ipv6-address-list = /aai/v10/network/vpes/vpe/{vnf-id}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +vpe|l-interface = /aai/v10/network/vpes/vpe/{vnf-id}/l-interfaces/l-interface/{interface-name} +vpe|lag-interface|l-interface|vlan|l3-interface-ipv4-address-list = /aai/v10/network/vpes/vpe/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +vpe|lag-interface|l-interface|vlan|l3-interface-ipv6-address-list = /aai/v10/network/vpes/vpe/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +vpe|lag-interface|l-interface|vlan = /aai/v10/network/vpes/vpe/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface} +vpe|lag-interface|l-interface|sriov-vf = /aai/v10/network/vpes/vpe/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/sriov-vfs/sriov-vf/{pci-id} +vpe|lag-interface|l-interface|l3-interface-ipv4-address-list = /aai/v10/network/vpes/vpe/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +vpe|lag-interface|l-interface|l3-interface-ipv6-address-list = /aai/v10/network/vpes/vpe/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +vpe|lag-interface|l-interface = /aai/v10/network/vpes/vpe/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name} +vpe|lag-interface = /aai/v10/network/vpes/vpe/{vnf-id}/lag-interfaces/lag-interface/{interface-name} +vpe|license = /aai/v10/network/vpes/vpe/{vnf-id}/licenses/license/{group-uuid}/{resource-uuid} +vpe|entitlement = /aai/v10/network/vpes/vpe/{vnf-id}/entitlements/entitlement/{group-uuid}/{resource-uuid} +vpe = /aai/v10/network/vpes/vpe/{vnf-id} +vnfc = /aai/v10/network/vnfcs/vnfc/{vnfc-name} +l3-network|subnet = /aai/v10/network/l3-networks/l3-network/{network-id}/subnets/subnet/{subnet-id} +l3-network|ctag-assignment = /aai/v10/network/l3-networks/l3-network/{network-id}/ctag-assignments/ctag-assignment/{vlan-id-inner} +l3-network|segmentation-assignment = /aai/v10/network/l3-networks/l3-network/{network-id}/segmentation-assignments/segmentation-assignment/{segmentation-id} +l3-network = /aai/v10/network/l3-networks/l3-network/{network-id} +network-policy = /aai/v10/network/network-policies/network-policy/{network-policy-id} +generic-vnf|l-interface|vlan|l3-interface-ipv4-address-list = /aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +generic-vnf|l-interface|vlan|l3-interface-ipv6-address-list = /aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +generic-vnf|l-interface|vlan = /aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface} +generic-vnf|l-interface|sriov-vf = /aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/l-interfaces/l-interface/{interface-name}/sriov-vfs/sriov-vf/{pci-id} +generic-vnf|l-interface|l3-interface-ipv4-address-list = /aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +generic-vnf|l-interface|l3-interface-ipv6-address-list = /aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +generic-vnf|l-interface = /aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/l-interfaces/l-interface/{interface-name} +generic-vnf|lag-interface|l-interface|vlan|l3-interface-ipv4-address-list = /aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +generic-vnf|lag-interface|l-interface|vlan|l3-interface-ipv6-address-list = /aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +generic-vnf|lag-interface|l-interface|vlan = /aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface} +generic-vnf|lag-interface|l-interface|sriov-vf = /aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/sriov-vfs/sriov-vf/{pci-id} +generic-vnf|lag-interface|l-interface|l3-interface-ipv4-address-list = /aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +generic-vnf|lag-interface|l-interface|l3-interface-ipv6-address-list = /aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +generic-vnf|lag-interface|l-interface = /aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name} +generic-vnf|lag-interface = /aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/lag-interfaces/lag-interface/{interface-name} +generic-vnf|vf-module = /aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/vf-modules/vf-module/{vf-module-id} +generic-vnf|license = /aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/licenses/license/{group-uuid}/{resource-uuid} +generic-vnf|entitlement = /aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/entitlements/entitlement/{group-uuid}/{resource-uuid} +generic-vnf = /aai/v10/network/generic-vnfs/generic-vnf/{vnf-id} +lag-link = /aai/v10/network/lag-links/lag-link/{link-name} +newvce|l-interface|vlan|l3-interface-ipv4-address-list = /aai/v10/network/newvces/newvce/{vnf-id2}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +newvce|l-interface|vlan|l3-interface-ipv6-address-list = /aai/v10/network/newvces/newvce/{vnf-id2}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +newvce|l-interface|vlan = /aai/v10/network/newvces/newvce/{vnf-id2}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface} +newvce|l-interface|sriov-vf = /aai/v10/network/newvces/newvce/{vnf-id2}/l-interfaces/l-interface/{interface-name}/sriov-vfs/sriov-vf/{pci-id} +newvce|l-interface|l3-interface-ipv4-address-list = /aai/v10/network/newvces/newvce/{vnf-id2}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +newvce|l-interface|l3-interface-ipv6-address-list = /aai/v10/network/newvces/newvce/{vnf-id2}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +newvce|l-interface = /aai/v10/network/newvces/newvce/{vnf-id2}/l-interfaces/l-interface/{interface-name} +newvce = /aai/v10/network/newvces/newvce/{vnf-id2} +pnf|p-interface|l-interface|vlan|l3-interface-ipv4-address-list = /aai/v10/network/pnfs/pnf/{pnf-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +pnf|p-interface|l-interface|vlan|l3-interface-ipv6-address-list = /aai/v10/network/pnfs/pnf/{pnf-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +pnf|p-interface|l-interface|vlan = /aai/v10/network/pnfs/pnf/{pnf-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface} +pnf|p-interface|l-interface|sriov-vf = /aai/v10/network/pnfs/pnf/{pnf-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/sriov-vfs/sriov-vf/{pci-id} +pnf|p-interface|l-interface|l3-interface-ipv4-address-list = /aai/v10/network/pnfs/pnf/{pnf-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +pnf|p-interface|l-interface|l3-interface-ipv6-address-list = /aai/v10/network/pnfs/pnf/{pnf-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +pnf|p-interface|l-interface = /aai/v10/network/pnfs/pnf/{pnf-name}/p-interfaces/p-interface/{interface-name}/l-interfaces/l-interface/{interface-name} +pnf|p-interface = /aai/v10/network/pnfs/pnf/{pnf-name}/p-interfaces/p-interface/{interface-name} +pnf|lag-interface|l-interface|vlan|l3-interface-ipv4-address-list = /aai/v10/network/pnfs/pnf/{pnf-name}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +pnf|lag-interface|l-interface|vlan|l3-interface-ipv6-address-list = /aai/v10/network/pnfs/pnf/{pnf-name}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +pnf|lag-interface|l-interface|vlan = /aai/v10/network/pnfs/pnf/{pnf-name}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface} +pnf|lag-interface|l-interface|sriov-vf = /aai/v10/network/pnfs/pnf/{pnf-name}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/sriov-vfs/sriov-vf/{pci-id} +pnf|lag-interface|l-interface|l3-interface-ipv4-address-list = /aai/v10/network/pnfs/pnf/{pnf-name}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +pnf|lag-interface|l-interface|l3-interface-ipv6-address-list = /aai/v10/network/pnfs/pnf/{pnf-name}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +pnf|lag-interface|l-interface = /aai/v10/network/pnfs/pnf/{pnf-name}/lag-interfaces/lag-interface/{interface-name}/l-interfaces/l-interface/{interface-name} +pnf|lag-interface = /aai/v10/network/pnfs/pnf/{pnf-name}/lag-interfaces/lag-interface/{interface-name} +pnf = /aai/v10/network/pnfs/pnf/{pnf-name} +physical-link = /aai/v10/network/physical-links/physical-link/{link-name} +ipsec-configuration|vig-server = /aai/v10/network/ipsec-configurations/ipsec-configuration/{ipsec-configuration-id}/vig-servers/vig-server/{vig-address-type} +ipsec-configuration = /aai/v10/network/ipsec-configurations/ipsec-configuration/{ipsec-configuration-id} +route-table-reference = /aai/v10/network/route-table-references/route-table-reference/{route-table-reference-id} +instance-group = /aai/v10/network/instance-groups/instance-group/{id} +zone = /aai/v10/network/zones/zone/{zone-id} diff --git a/aai-service/provider/src/main/resources/aai-schema-bindings.xjb b/aai-service/provider/src/main/resources/aai-schema-bindings.xjb new file mode 100755 index 00000000..e6292fa1 --- /dev/null +++ b/aai-service/provider/src/main/resources/aai-schema-bindings.xjb @@ -0,0 +1,11 @@ + + + + + + + diff --git a/aai-service/provider/src/main/resources/aai_schema_v10.xsd b/aai-service/provider/src/main/resources/aai_schema_v10.xsd new file mode 100755 index 00000000..fed5baf8 --- /dev/null +++ b/aai-service/provider/src/main/resources/aai_schema_v10.xsd @@ -0,0 +1,6563 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The specific type of node in the A&AI graph") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The URL to the specific resource") + + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="A keyword provided by A&AI to indicate an attribute.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Value of the attribute.") + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Key part of a key/value pair") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Value part of a key/value pair") + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="A keyword provided by A&AI to indicate type of node.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="URL to the object in A&AI.") + + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="OAM network, to be deprecated shortly. Do not use for new purposes. ",nameProps="network-name",indexedProps="cvlan-tag,network-uuid,network-name",dependentOn="cloud-region",container="oam-networks") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="UUID of the network. Unique across a cloud-region") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Name of the network.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="cvlan-id") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for VNF firewall rule so customer cannot send customer traffic over this oam network") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for VNF firewall rule so customer cannot send customer traffic over this oam network") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of OAM networks, to be deprecated shortly. Do not use for new purposes. ") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Digital virtual switch metadata, used by SDN-C to configure VCEs. A&AI needs to receive this data from the PO deployment team and administer it using the provisioningTool.sh into A&AI. ",indexedProps="vcenter-url,switch-name",dependentOn="cloud-region",container="dvs-switches") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="DVS switch name") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="URL used to reach the vcenter") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of digital virtual switch metadata used for vmWare VCEs and VPEs.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Availability zone, a collection of compute hosts/pservers",indexedProps="availability-zone-name",dependentOn="cloud-region",container="availability-zones") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Name of the availability zone. Unique across a cloud region") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Type of hypervisor. Source of truth should define valid values.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Status that indicates whether the asset is in or out of the service path. Valid values are null, in-service-path, out-of-service-path.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Serves a PATCH like function. Does not enforce concurrency control. Clear each usage with AAI team.") + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="APIs that are more action related than REST (e.g., notify, update).") + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="A collection of C tags (vlan tags) grouped for a specific purpose.",indexedProps="availability-zone-name",dependentOn="complex",container="ctag-pools") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="The Target provider edge router") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Name of the availability zone") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Describes what the intended purpose of this pool is.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Comma separated list of ctags") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of physical locations that can house cloud-regions.",indexedProps="identity-url,data-center-code,complex-name,physical-location-id",searchable="physical-location-id,data-center-code,complex-name,street1,street2,postal-code",uniqueProps="physical-location-id",container="complexes",namespace="cloud-infrastructure") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique identifier for physical location, e.g., CLLI") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Data center code which can be an alternate way to identify a complex") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Gamma complex name for LCP instance.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="URL of the keystone identity service") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Type, e.g., central office, data center.") + + + + + + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of physical locations that can house cloud-regions.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Persistent block-level storage.",indexedProps="volume-group-name,vnf-type,heat-stack-id,volume-group-id",searchable="volume-group-id,volume-group-name",dependentOn="cloud-region",container="volume-groups") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique ID of volume-group.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Name of the volume group.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Heat stack id corresponding to this volume-group") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="String capturing type of vnf, that was intended to identify the ASDC resource. This field has been overloaded in service-specific ways and clients should expect changes to occur in the future to this field as ECOMP matures.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Orchestration status of this volume-group") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="captures the id of all the configuration used to customize the resource for the service.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="helps relate the volume group to the vf-module whose components will require the volume group") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of persistent block-level storage.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Ephemeral Block storage volume.",indexedProps="volume-id",dependentOn="vserver",container="volumes") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique ID of block storage volume relative to the vserver.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="URL to endpoint where AAI can get more details") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of ephemeral Block storage volumes.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="IPv4 Address Range",indexedProps="l3-interface-ipv4-address,vlan-id-inner,neutron-network-id,neutron-subnet-id",dependentOn="vlan,l-interface") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="IP address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Prefix length, 32 for single address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Inner VLAN tag") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Outer VLAN tag") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Indicator of fixed or floating address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Neutron network id of the interface that address belongs to") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Neutron id of subnet that address belongs to") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="IPv6 Address Range",indexedProps="l3-interface-ipv6-address,vlan-id-inner,neutron-network-id,neutron-subnet-id",dependentOn="vlan,l-interface") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="IP address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Prefix length, 128 for single address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Inner VLAN tag") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Outer VLAN tag") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Indicator of fixed or floating address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Neutron network id of the interface that address belongs to") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Neutron id of subnet that address belongs to") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Definition of vlan",indexedProps="vlan-interface,vlan-id-inner,vpn-id",uniqueProps="vpn-id",dependentOn="l-interface",container="vlans") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="String that identifies the interface") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Inner VLAN tag") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Outer VLAN tag") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Captures the numeric part of the speed") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Captures the units corresponding to the speed") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used to describe (the service associated with) the vlan") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Whether customer is going to use this VLAN for backdoor connection to another customer premise device.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="This indicates the customers VPN ID associated with this vlan") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Status of a vnf's vlan interface, on which the customer circuit resides, mastered by SDN-C.") + + + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="SR-IOV Virtual Function (not to be confused with virtual network function)",indexedProps="pci-id,vf-vlan-filter,vf-mac-filter,vf-vlan-strip,neutron-network-id",dependentOn="l-interface",container="sriov-vfs") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="PCI ID used to identify the sriov-vf") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="This metadata provides option to specify list of VLAN filters applied on VF to pass the traffic to VM.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="When MAC filters are specified, VF-agent service configures VFs to do MAC level filtering before the traffic is passed to VM.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="When this field is set to true, VF will configured to strip the outer TAG before the traffic is passed to VM.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="This option ensures anti VLAN spoof checks are done at the VF level to comply with security. The disable check will also be honored per the VNF needs for trusted VMs.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="This option ensures anti MAC spoof checks are done at the VF level to comply with security. The disable check will also be honored per the VNF needs for trusted VMs.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="This option defines the set of Mirror objects which essentially mirrors the traffic from source to set of collector VNF Ports.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="This option, if set to true, sets the VF in promiscuous mode and allows all broadcast traffic to reach the VM") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="This option, if set to true, sets the VF in promiscuous mode and allows unknown multicast traffic to reach the VM") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="This option, if set to true, sets the VF in promiscuous mode and allows unknown unicast traffic to reach the VM") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="This option, if set to true, instructs to insert outer tag after traffic comes out of VM.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="This option is used to set the link status. Valid values as of 1607 are on, off, and auto.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Neutron network id of the interface") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of SR-IOV Virtual Functions.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Logical interfaces, e.g., a vnic.",indexedProps="macaddr,interface-id,interface-name,network-name",dependentOn="generic-vnf,newvce,vpe,p-interface,vserver,lag-interface",container="l-interfaces") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Name given to the interface") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="E.g., CUSTOMER, UPLINK, etc.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Questionably placed - v6 ip addr of this interface (is in vr-lan-interface from Mary B.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="URL to endpoint where AAI can get more details") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="ID of interface") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="MAC address for the interface") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Name of the network") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Whether A&AI should be managing this interface of not. Could have value like CUSTOMER") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Human friendly text regarding this interface.") + + + + + + + @org.openecomp.aai.annotations.Metadata(defaultValue="false",description="used to indicate whether or not this port is mirrored.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of logical interfaces.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Virtual Servers, aka virtual machine or VM.",nameProps="vserver-name",indexedProps="is-closed-loop-disabled,prov-status,vserver-name,vserver-id,in-maint,vserver-name2",searchable="vserver-id,vserver-name,vserver-name2",dependentOn="tenant",container="vservers") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique identifier for this vserver relative to its tenant") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Name of vserver") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Alternative name of vserver") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Trigger for operational monitoring of this resource by Service Assurance systems.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="URL to endpoint where AAI can get more details") + + + + + + + @org.openecomp.aai.annotations.Metadata(defaultValue="false",description="Used to indicate whether or not this object is in maintenance mode (maintenance mode = true). This field (in conjunction with prov-status) is used to suppress alarms and vSCL on VNFs/VMs.") + + + + + + + @org.openecomp.aai.annotations.Metadata(defaultValue="false",description="Used to indicate whether closed loop function is enabled on this node") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of virtual Servers, aka virtual machines or VMs.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Openstack tenant",nameProps="tenant-name",indexedProps="tenant-name,tenant-id",searchable="tenant-id,tenant-name",dependentOn="cloud-region",container="tenants") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique id relative to the cloud-region.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Readable name of tenant") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of openstack tenants.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Openstack flavor.",nameProps="flavor-name",indexedProps="flavor-name,flavor-id",dependentOn="cloud-region",container="flavors") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Flavor id, expected to be unique across cloud-region.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Flavor name") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Number of CPUs") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Amount of memory") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Disk space") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Amount of ephemeral disk space") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="amount of swap space allocation") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="whether flavor is available to all users or private to the tenant it was created in.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="URL to endpoint where AAI can get more details") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Boolean as to whether this flavor is no longer enabled") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of openstack flavors.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Openstack group-assignment used to store exclusivity groups (EG).",nameProps="group-name",indexedProps="group-id,group-type,group-name",dependentOn="cloud-region",container="group-assignments") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Group id, expected to be unique across cloud-region.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Group type - the type of group this instance refers to") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Group name - name assigned to the group") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Group description - description of the group") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of openstack group assignments") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Openstack snapshot",nameProps="snapshot-name",uniqueProps="snapshot-id",indexedProps="application,snapshot-name,application-vendor,snapshot-id,application-version,prev-snapshot-id",dependentOn="cloud-region",container="snapshots") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Snapshot id, this is the key UUID assoc associated in glance with the snapshots.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Snapshot name") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Operating system architecture") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The common name of the operating system distribution in lowercase") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The operating system version as specified by the distributor.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The application that the image instantiates.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The vendor of the application.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The version of the application.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="URL to endpoint where AAI can get more details") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="This field contains the UUID of the previous snapshot (if any).") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of openstack snapshots") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Key/value pairs",indexedProps="metaname",dependentOn="tenant,image,service-instance,connector,model",container="metadata") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true) + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of metadatum (key/value pairs)") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Openstack image.",nameProps="image-name",indexedProps="application,image-name,application-vendor,image-id,application-version",dependentOn="cloud-region",container="images") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Image id, expected to be unique across cloud region") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Image name") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Operating system architecture.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The common name of the operating system distribution in lowercase") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The operating system version as specified by the distributor.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The application that the image instantiates.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The vendor of the application.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The version of the application.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="URL to endpoint where AAI can get more details") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collectio of Openstack images.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of availability zones") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="cloud-region designates an installation of a cloud cluster or region or instantiation. In AT&Ts AIC cloud, this could be an LCP or DCP. Cloud regions are uniquely identified by a composite key, cloud-owner + cloud-region-id. The format of the cloud-owner is vendor-cloudname and we will use att-aic for AT&T's AIC. It's important to note that the cloud-region data is not updated once created, so there is a potential for the data to become stale.",indexedProps="cloud-owner,cloud-region-id,cloud-type,owner-defined-type",nameProps="owner-defined-type",container="cloud-regions",namespace="cloud-infrastructure") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Identifies the vendor and cloud name, e.g., att-aic. First part of composite key should be formatted as vendor-cloudname") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Identifier used by the vendor for the region. Second part of composite key") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Type of the cloud (e.g., openstack)") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Cloud-owner defined type indicator (e.g., dcp, lcp)") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Software version employed at the site. NOTE - THIS FIELD IS NOT KEPT UP TO DATE.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="URL of the keystone identity service") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Zone where the cloud is homed. NOTE - THIS FIELD IS NOT CORRECTLY POPULATED.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="complex name for cloud-region instance. NOTE - THIS FIELD IS NOT CORRECTLY POPULATED.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(maximumDepth="0") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Network profile populated by SDN-GP for SNMP",indexedProps="nm-profile-name",container="network-profiles",namespace="cloud-infrastructure") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique name of network profile.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Encrypted SNMP community string") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of network profiles") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Physical interface (e.g., nic)",indexedProps="interface-name,prov-status",nameProps="prov-status",dependentOn="vpls-pe,pserver,pnf",container="p-interfaces") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Name that identifies the physical interface") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Captures the numeric part of the speed") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Captures the units corresponding to the speed") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Nature of the services and connectivity on this port.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="CLEI or other specification for p-interface hardware.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Role specification for p-interface hardware.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Indicates the physical properties of the interface.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Trigger for operational monitoring of this resource by Service Assurance systems.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of physical interfaces.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Link aggregate interface",indexedProps="interface-name,interface-id,interface-role",dependentOn="generic-vnf,pserver,vpe,vpls-pe,pnf",container="lag-interfaces") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Name that identifies the link aggregate interface") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Human friendly text regarding this interface.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Captures the numeric part of the speed") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Captures the units corresponding to the speed") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="ID of interface") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Role assigned to this Interface, should use values as defined in ECOMP Yang models.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Trigger for operational monitoring of this resource by Service Assurance systems.") + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of link aggregate interfaces.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Compute host whose hostname must be unique and must exactly match what is sent as a relationship to a vserver.",nameProps="pserver-name2",indexedProps="hostname,in-maint,pserver-id,pserver-name2,inv-status",searchable="hostname,pserver-name2,pserver-id,ipv4-oam-address",container="pservers",namespace="cloud-infrastructure") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Value from executing hostname on the compute node.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="PTNII name") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Number of cpus") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Disk size, in GBs") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="RAM size, in MBs") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Equipment type. Source of truth should define valid values.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Equipment vendor. Source of truth should define valid values.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Equipment model. Source of truth should define valid values.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Fully-qualified domain name") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="URL to endpoint where AAI can get more details") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used to configure device, also used for troubleshooting and is IP used for traps generated by device.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Serial number, may be queried") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="IPV4 Loopback 0 address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="IPV6 Loopback 0 address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="IPV4 AIM address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="IPV6 AIM address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="IPV6 OAM address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="CANOPI's inventory status. Only set with values exactly as defined by CANOPI.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="ID of Pserver") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="internet topology of Pserver") + + + + + + + @org.openecomp.aai.annotations.Metadata(defaultValue="false",description="used to indicate whether or not this object is in maintenance mode (maintenance mode = true). This field (in conjunction with prov-status) is used to suppress alarms and vSCL on VNFs/VMs.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="alternative pserver name") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="purpose of pserver") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Prov Status of this device (not under canopi control) Valid values [PREPROV/NVTPROV/PROV]") + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of compute hosts.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Virtual organization of cloud infrastructure elements in a data center context",nameProps="vdc-name",indexedProps="vdc-name,vdc-id",container="virtual-data-centers",namespace="cloud-infrastructure") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique ID of the vdc") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Name of the virtual data center") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Virtual organization of cloud infrastructure elements in a data center context") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Namespace for cloud infrastructure.") + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of resource instances used to connect a variety of disparate inventory widgets",indexedProps="resource-instance-id,model-invariant-id,model-version-id,widget-model-id,widget-model-version",container="connectors",namespace="business") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique id of resource instance.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC model id for this resource or service model.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC model version uuid for this resource or service model.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC data dictionary widget model. This maps directly to the A&AI widget.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC data dictionary version of the widget model.This maps directly to the A&AI version of the widget.") + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of resource instances used to connect a variety of disparate inventory widgets") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Represents the specifics of a tunnel cross connect piece of a resource that gets separately allotted",uniqueProps="id",indexedProps="id",dependentOn="allotted-resource",container="tunnel-xconnects") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Allotted Resource id UUID assigned to this instance.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The WAN uplink bandwidth for WAN1") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The WAN downlink bandwidth for WAN1") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The WAN uplink bandwidth for WAN2") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The WAN downlink bandwidth for WAN2") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Concurrency value") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="This object is used to store the specific tunnel cross connect aspects of an allotted resource") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Represents a slice or partial piece of a resource that gets separately allotted",nameProps="description",uniqueProps="id",indexedProps="id,model-invariant-id,model-version-id,type,role",dependentOn="service-instance",container="allotted-resources") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Allotted Resource id UUID assigned to this instance.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The descriptive information assigned to this allotted resource instance") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Link back to more information in the controller") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC model id for this resource or service model.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC model version uuid for this resource or service model.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="captures the id of all the configuration used to customize the resource for the service.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Orchestration status of this resource, mastered by MSO") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Status that indicates whether the asset is in or out of the service path. Valid values are null, in-service-path, out-of-service-path.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Concurrency value") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Generic description of the type of the resource") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Role that this asset will be playing in its context.") + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="This object is used to store slices of services being offered") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Instance of a service",indexedProps="service-instance-id,model-invariant-id,model-version-id,widget-model-id,widget-model-version,service-instance-name,service-instance-location-id,orchestration-status",nameProps="service-instance-name",searchable="service-instance-id,service-instance-name",uniqueProps="service-instance-id",dependentOn="service-subscription",container="service-instances") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Uniquely identifies this instance of a service") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="This field will store a name assigned to the service-instance.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC model id for this resource or service model.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC model version uuid for this resource or service model.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC data dictionary widget model. This maps directly to the A&AI widget.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC data dictionary version of the widget model.This maps directly to the A&AI version of the widget.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Indicates the total bandwidth to be used for this service.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="indicates the upstream bandwidth this service will use on the WAN1 port of the physical device.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="indicates the downstream bandwidth this service will use on the WAN1 port of the physical device.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="indicates the upstream bandwidth this service will use on the WAN2 port of the physical device.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="indicates the downstream bandwidth this service will use on the WAN2 port of the physical device.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="URL customers will use to access the vHN Portal.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="An identifier that customers assign to the location where this service is being used.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Path to the controller object.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Orchestration status of this service.") + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of service instances") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Object that group service instances.",indexedProps="service-type",dependentOn="customer",container="service-subscriptions",crossEntityReference="service-instance,service-type") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Value defined by orchestration to identify this service across ECOMP.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="This property will be deleted from A&AI in the near future. Only stop gap solution.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of objects that group service instances.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="customer identifiers to provide linkage back to BSS information.",nameProps="subscriber-name",indexedProps="subscriber-name,global-customer-id,subscriber-type",searchable="global-customer-id,subscriber-name",uniqueProps="global-customer-id",container="customers",namespace="business") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Global customer id used across ECOMP to uniquely identify customer.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Subscriber name, an alternate way to retrieve a customer.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Subscriber type, a way to provide VID with only the INFRA customers.",defaultValue="CUST") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of customer identifiers to provide linkage back to BSS information.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Namespace for business related constructs") + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Image object that pertain to a VNF that doesn't have associated vservers. This is a kludge.",indexedProps="application,att-uuid,application-vendor,application-version",uniqueProps="att-uuid",container="vnf-images",namespace="service-design-and-creation") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique ID of this asset") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The application that the image instantiates.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The vendor of the application.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The version of the application.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="URL to endpoint where AAI can get more details") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of image objects that pertain to a VNF that doesn't have associated vservers. This is a kludge.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Stand-in for service model definitions. Likely to be deprecated in favor of models from ASDC. Does not strictly map to ASDC services.",indexedProps="service-description,service-id",container="services",namespace="service-design-and-creation") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="This gets defined by others to provide a unique ID for the service, we accept what is sent.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Description of the service") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="URL to endpoint where AAI can get more details") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="service version") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of service model definitions. Likely to be deprecated in favor of models from ASDC.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Early definition of server/resource pairings, likely to be replaced by models. No new use should be made of this.",indexedProps="service-type,vnf-type",container="service-capabilities",namespace="service-design-and-creation") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="This gets defined by others to provide a unique ID for the service, we accept what is sent.") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="String capturing type of vnf, that was intended to identify the ASDC resource. This field has been overloaded in service-specific ways and clients should expect changes to occur in the future to this field as ECOMP matures.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of service capabilities.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="This is how we would capture constraints defining allowed sets of elements.",uniqueProps="element-choice-set-uuid",indexedProps="element-choice-set-uuid",allowDirectRead="true",allowDirectWrite="false",container="element-choice-sets") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,autoGenerateUuid="true") + + + + + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="This is how we would capture constraints defining allowed sets of elements.",uniqueProps="constrained-element-set-uuid",indexedProps="constrained-element-set-uuid",allowDirectRead="true",allowDirectWrite="false",container="constrained-element-sets") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,autoGenerateUuid="true") + + + + + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="This is how we would capture constraints defining allowed sets of elements.",uniqueProps="model-constraint-uuid",indexedProps="model-constraint-uuid",allowDirectRead="true",allowDirectWrite="false",container="model-constraints") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,autoGenerateUuid="true") + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Defines how other models combine to make up a higher-level model.",uniqueProps="model-element-uuid",indexedProps="model-element-uuid",allowDirectRead="true",allowDirectWrite="false",container="model-elements") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,autoGenerateUuid="true") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Indicates whether this element was created as part of instantiation from this model") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="How many of this type of element are required/allowed") + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Defines how other models combine to make up a higher-level model.",uniqueProps="model-element-uuid",indexedProps="model-element-uuid",allowDirectRead="true",allowDirectWrite="false",container="model-elements") + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Defines how other models combine to make up a higher-level model") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Describes new constraints on this model element that are not part of that model's definition") + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Subgraph definition provided by ASDC to describe a specific version of an inventory asset and its connections related to ASDC models",nameProps="model-name",indexedProps="model-version-id,model-name,model-version",uniqueProps="model-version-id",container="model-vers") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique identifier corresponding to one version of a model in ASDC") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Name of the model, which can change from version to version.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Version") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Description") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Subgraph definition provided by ASDC to describe an inventory asset and its connections related to ASDC models, independent of version",nameProps="model-type",indexedProps="model-invariant-id,model-type",uniqueProps="model-invariant-id",container="models",namespace="service-design-and-creation") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique identifier corresponding to the main definition of a model in ASDC") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Type of the model, e.g., service, resource, widget, etc.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of subgraph definitions provided by ASDC to describe the inventory assets and their connections related to ASDC models") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="TBD",uniqueProps="related-lookup-uuid",indexedProps="related-lookup-uuid",allowDirectRead="true",allowDirectWrite="false",container="related-lookups") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,autoGenerateUuid="true") + + + + + + + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="TBD",uniqueProps="property-constraint-uuid",indexedProps="property-constraint-uuid",allowDirectRead="true",allowDirectWrite="false",container="property-constraints") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,autoGenerateUuid="true") + + + + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="TBD",uniqueProps="named-query-element-uuid",indexedProps="named-query-element-uuid",allowDirectRead="true",allowDirectWrite="false",container="named-query-elements") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,autoGenerateUuid="true") + + + + + + + + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="TBD",nameProps="named-query-name",uniqueProps="named-query-uuid",indexedProps="named-query-uuid,named-query-name",container="named-queries",namespace="service-design-and-creation") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true) + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="TBD",nameProps="named-query-name",uniqueProps="named-query-uuid",indexedProps="named-query-uuid,named-query-name",container="named-queries",namespace="service-design-and-creation") + + + + + + + + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Namespace for objects managed by ASDC") + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Logical links generally connect l-interfaces but are used to express logical connectivity between two points",indexedProps="link-name,model-invariant-id,model-version-id,widget-model-id,widget-model-version,link-id,prov-status,circuit-id,purpose",uniqueProps="link-id",container="logical-links",namespace="network",searchable="link-name") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="e.g., evc-name, or vnf-nameA_interface-nameA_vnf-nameZ_interface-nameZ") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Type of logical link, e.g., evc") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Captures the numeric part of the speed") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Captures the units corresponding to the speed") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="v4, v6, or ds for dual stack (should be att-ip-version)") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="For example, static or BGP") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC model id for this resource or service model.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC model version uuid for this resource or service model.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC data dictionary widget model. This maps directly to the A&AI widget.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC data dictionary version of the widget model.This maps directly to the A&AI version of the widget.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Status that indicates whether the asset is in or out of the service path. Valid values are null, in-service-path, out-of-service-path.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Trigger for operational monitoring of this VNF by BAU Service Assurance systems.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Indication of the network use of the logical link.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Alias or alternate name (CLCI or D1 name).") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="UUID of the logical-link, SDNC generates this.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Circuit id") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Reason for this entity, role it is playing") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of logical connections") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(indexedProps="cos",dependentOn="site-pair",container="classes-of-service") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="unique identifier of probe") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="identifier of probe") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="type of probe") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="class-of-service of probe") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(indexedProps="site-pair-id",uniqueProps="site-pair-id",dependentOn="routing-instance",container="site-pairs") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="unique identifier of probe") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Prefix address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Prefix address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="ip version, v4, v6") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Hostname of the destination equipment to which SLAs are measured against.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The type of destinatination equipment. Could be Router, UCPE, etc.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="probe within a set") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(indexedProps="routing-instance-id",uniqueProps="routing-instance-id",dependentOn="site-pair-set",container="routing-instances") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique id of routing instance") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="rpm owner") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="set of probes related to generic-vnf routing instance") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Set of instances for probes used to measure service level agreements",indexedProps="site-pair-set-id",uniqueProps="site-pair-set-id",container="site-pair-sets",namespace="network") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique id of site pair set.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of sets of instances for probes related to generic-vnf") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="stores the global route targets associated with a VPN",indexedProps="global-route-target,route-target-role",searchable="global-route-target",container="route-targets",namespace="network") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Number used to identify an RT, globally unique in the network") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Role assigned to this route target, valid values EXPORT/IMPORT/BOTH") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Relationship to other objects") + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="VPN binding",nameProps="vpn-name,vpn-type",indexedProps="vpn-name,vpn-id,global-route-target,vpn-type",searchable="vpn-id,vpn-name",uniqueProps="vpn-id",container="vpn-bindings",namespace="network") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="VPN ID, globally unique within A&AI") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="VPN Name") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Number used to identify a VPN, globally unique in the network. NOTE - WILL BE RETIRED IN 1802, see child object") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the platform associated with the VPN example AVPN, Mobility") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Type of the vpn, should be taken from enumerated/valid values") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used to distinguish the distinct VPN routes of separate customers who connect to the provider in an MPLS network.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Role assigned to this route target. NOTE - WILL BE RETIRED IN 1802, see child object") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="l3-networks relate to vpn-bindings") + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="VPLS Provider Edge routers.",indexedProps="prov-status,equipment-name",container="vpls-pes",namespace="network") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true) + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Trigger for operational monitoring of this VNF by BAU Service Assurance systems.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Address tail-f uses to configure vpe, also used for troubleshooting and is IP used for traps generated by VPE (v4-loopback0-ip-address).") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Client should send valid enumerated value, e.g., VPLS-PE.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Temporary location for stag to get to VCE") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of VPLS Provider Edge routers") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(indexedProps="multicast-configuration-id",uniqueProps="multicast-configuration-id",container="multicast-configurations",namespace="network") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique id of multicast configuration.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="protocol of multicast configuration") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="rp type of multicast configuration") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="multicast configuration of generic-vnf ip-address") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(dependentOn="port-group",indexedProps="cvlan-tag",container="cvlan-tags") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="See mis-na-virtualization-platform.yang") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used to capture the network interfaces of this VCE",nameProps="port-group-name",indexedProps="port-group-id,heat-stack-id,interface-id,interface-name,switch-name",dependentOn="vce",container="port-groups") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique ID of the interface") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Neutron network id of this Interface") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Neutron network name of this Interface") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Role assigned to this Interface, should use values as defined in ECOMP Yang models.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Unique ID for port group in vmware") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Likely to duplicate value of neutron network name") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="DVS or standard switch name (should be non-null for port groups associated with DVS)") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Orchestration status of this VNF, mastered by MSO") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Heat stack id corresponding to this instance, managed by MSO") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Corresponds to the SDN-C catalog id used to configure this VCE") + + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Metadata for license group.",indexedProps="group-uuid,resource-uuid",dependentOn="generic-vnf,vce,vpe",container="licenses") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique ID for the license group the resource belongs to, should be uuid.") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique ID of a license resource. ") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Concurrency value") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Licenses to be allocated across resources, keyed by group-uuid and resource-uuid, related to license management") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Metadata for entitlement group.",indexedProps="group-uuid,resource-uuid",dependentOn="generic-vnf,vce,vpe",container="entitlements") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique ID for the entitlement group the resource comes from, should be uuid.") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique ID of an entitlement resource. ") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Concurrency value") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Entitlements, keyed by group-uuid and resource-uuid, related to license management") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Virtual Customer Edge Router, used specifically for Gamma. This object is deprecated.",nameProps="vnf-name",indexedProps="vnf-name,vnf-name2,vnf-type,heat-stack-id,vnf-id,interface-name,regional-resource-zone,vpe-id,prov-status,service-id",searchable="vnf-id,vnf-name,vnf-name2",uniqueProps="vnf-id",container="vces",namespace="network",extendsFrom="vnf") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique id of VNF. This is unique across the graph.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Name of VNF.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Alternate name of VNF.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="String capturing type of vnf, that was intended to identify the ASDC resource. This field has been overloaded in service-specific ways and clients should expect changes to occur in the future to this field as ECOMP matures.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Unique identifier of service, does not strictly map to ASDC services, SOON TO BE DEPRECATED.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Regional way of organizing pservers, source of truth should define values") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Trigger for operational monitoring of this resource by Service Assurance systems.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Status that indicates whether the asset is in or out of the service path. Valid values are null, in-service-path, out-of-service-path.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Network role being played by this VNF") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Orchestration status of this VNF, mastered by MSO") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Heat stack id corresponding to this instance, managed by MSO") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Corresponds to the SDN-C catalog id used to configure this VCE") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Unique ID of VPE connected to this VCE.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Valid v6 IP address for the WAN Link on this router. Implied length of /64.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Address tail-f uses to configure vce, also used for troubleshooting and is IP used for traps generated by VCE.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Loopback0 address") + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of Virtual Customer Edge Routers, used specifically for Gamma. This object is deprecated.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Relationship-list must include related to info for complex.",nameProps="vnf-name",indexedProps="vnf-name,vnf-name2,vnf-type,heat-stack-id,vnf-id,regional-resource-zone,prov-status,service-id",searchable="vnf-id,vnf-name,vnf-name2",uniqueProps="vnf-id",container="vpes",namespace="network",extendsFrom="vnf") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique id of VNF. This is unique across the graph.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Name of VNF.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Alternate name of VNF.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="String capturing type of vnf, that was intended to identify the ASDC resource. This field has been overloaded in service-specific ways and clients should expect changes to occur in the future to this field as ECOMP matures.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Unique identifier of service. Does not map strictly to ASDC services. SOON TO BE DEPRECATED") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Regional way of organizing pservers, source of truth should define values") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Trigger for operational monitoring of this resource by Service Assurance systems.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Status that indicates whether the asset is in or out of the service path. Valid values are null, in-service-path, out-of-service-path.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Client should send valid enumerated value") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Orchestration status of this VNF, mastered by MSO") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Heat stack id corresponding to this instance, managed by MSO") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Corresponds to the SDN-C catalog id used to configure this VCE") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Address tail-f uses to configure vpe, also used for troubleshooting and is IP used for traps generated by VPE (v4-loopback0-ip-address).") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Prefix length for oam-address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Gateway address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Loopback0 address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Temporary location for stag to get to VCE") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="as-number of the VPE") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="details regarding the vpe operation, PLEASE DISCONTINUE USE OF THIS FIELD.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="indicates whether vpe access uses SSH") + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Virtual provider edge router. In 1504, A&AI will populate this object through an M&P and tool provided to operations.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(indexedProps="vnfc-name,prov-status,vnfc-type,vnfc-function-code,ipaddress-v4-oam-vip,in-maint,is-closed-loop-disabled,group-notation",searchable="vnfc-name",container="vnfcs",namespace="network") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique ID of vnfc.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="function code") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="type") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="prov status of this vnfc") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Orchestration status of this VNF, mastered by APP-C") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Oam V4 vip address of this vnfc") + + + + + + + @org.openecomp.aai.annotations.Metadata(defaultValue="false",description="used to indicate whether or not this object is in maintenance mode (maintenance mode = true)") + + + + + + + @org.openecomp.aai.annotations.Metadata(defaultValue="false",description="used to indicate whether closed loop function is enabled on this node") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Group notation of VNFC") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="virtual network components associated with a vserver from application controller.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(indexedProps="subnet-id,subnet-name",nameProps="subnet-name",uniqueProps="subnet-id",dependentOn="l3-network",container="subnets") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Subnet ID, should be UUID.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Name associated with the subnet.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Neutron id of this subnet") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="gateway ip address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="network start address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="cidr mask") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="ip version") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Orchestration status of this VNF, mastered by MSO") + + + + + + + @org.openecomp.aai.annotations.Metadata(defaultValue="false",description="dhcp enabled") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the start address reserved for use by dhcp") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the last address reserved for use by dhcp") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(indexedProps="vlan-id-inner",dependentOn="l3-network",container="ctag-assignments") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="id.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Openstack segmentation assignment.",indexedProps="segmentation-id",dependentOn="l3-network",container="segmentation-assignments") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Route Table Reference id, UUID assigned to this instance.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Concurrency value") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of openstack segmentation assignments") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Generic network definition",nameProps="network-name",indexedProps="heat-stack-id,network-uuid,service-id,network-id,network-name,model-invariant-id,model-version-id,widget-model-id,widget-model-version,contrail-network-fqdn,network-role",searchable="network-id,network-name",uniqueProps="network-id",container="l3-networks",namespace="network") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Network ID, should be uuid. Unique across A&AI.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Name of the network, governed by some naming convention..") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Type of the network - who defines these values?") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Role the network plans - who defines these values?") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Network technology - who defines these values?") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Neutron network id of this Interface") + + + + + + + @org.openecomp.aai.annotations.Metadata(defaultValue="false",description="Set to true if bound to VPN") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Unique identifier of service from ASDC. Does not strictly map to ASDC services. SOON TO BE DEPRECATED") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="network role instance") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Orchestration status of this VNF, mastered by MSO") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Heat stack id corresponding to this instance, managed by MSO") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Corresponds to the SDN-C catalog id used to configure this VCE") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Contrail FQDN for the network") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC model id for this resource or service model.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC model version uuid for this resource or service model.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="captures the id of all the configuration used to customize the resource for the service.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC data dictionary widget model. This maps directly to the A&AI widget.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC data dictionary version of the widget model.This maps directly to the A&AI version of the widget.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Name associated with the physical network.") + + + + + + + @org.openecomp.aai.annotations.Metadata(defaultValue="false",description="boolean indicatating whether or not network is a provider network.") + + + + + + + @org.openecomp.aai.annotations.Metadata(defaultValue="false",description="boolean indicatating whether or not network is a shared network.") + + + + + + + @org.openecomp.aai.annotations.Metadata(defaultValue="false",description="boolean indicatating whether or not network is an external network.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Status that indicates whether the asset is in or out of the service path. Valid values are null, in-service-path, out-of-service-path.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Path to the controller object.") + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Relates to tenant (or is it a child of tenant), complex, service, vpn-binding") + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(nameProps="network-policy-fqdn",indexedProps="network-policy-id,network-policy-fqdn",searchable="network-policy-id,network-policy-fqdn",uniqueProps="network-policy-id",container="network-policies",namespace="network") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="UUID representing unique key to this instance") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Contrail FQDN for the policy") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="ID for the openStack Heat instance") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="a deployment unit of VNFCs",indexedProps="vf-module-id,vf-module-name,heat-stack-id,model-invariant-id,model-version-id,widget-model-id,widget-model-version,contrail-service-instance-fqdn",searchable="vf-module-id,vf-module-name",dependentOn="generic-vnf",container="vf-modules") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique ID of vf-module.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Name of vf-module") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Heat stack id corresponding to this instance.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="orchestration status of this vf-module, mastered by MSO") + + + + + + + @org.openecomp.aai.annotations.Metadata(defaultValue="false",description="used to indicate whether or not this object is base vf module") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC model id for this resource or service model.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC model version uuid for this resource or service model.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="captures the id of all the configuration used to customize the resource for the service.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC data dictionary widget model. This maps directly to the A&AI widget.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC data dictionary version of the widget model.This maps directly to the A&AI version of the widget.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the Contrail unique ID for a service-instance") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the index will track the number of modules of a given type that have been deployed in a VNF, starting with 0, and always choosing the lowest available digit") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Path to the controller object.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of vf-modules, a deployment unit of VNFCs") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="General purpose VNF",nameProps="vnf-name",indexedProps="is-closed-loop-disabled,vnf-name2,vnf-type,heat-stack-id,in-maint,vnf-name,vnf-id,regional-resource-zone,prov-status,service-id,model-invariant-id,model-version-id,widget-model-id,widget-model-version,nf-type,nf-role,nf-function,nf-naming-code",searchable="vnf-id,vnf-name,vnf-name2",uniqueProps="vnf-id",container="generic-vnfs",namespace="network",extendsFrom="vnf") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique id of VNF. This is unique across the graph.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Name of VNF.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Alternate name of VNF.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="String capturing type of vnf, that was intended to identify the ASDC resource. This field has been overloaded in service-specific ways and clients should expect changes to occur in the future to this field as ECOMP matures.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Unique identifier of service, does not necessarily map to ASDC service models. SOON TO BE DEPRECATED") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Regional way of organizing pservers, source of truth should define values") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Trigger for operational monitoring of this resource by Service Assurance systems.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Status that indicates whether the asset is in or out of the service path. Valid values are null, in-service-path, out-of-service-path.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Client should send valid enumerated value") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Orchestration status of this VNF, used by MSO.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Heat stack id corresponding to this instance, managed by MSO") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Corresponds to the SDN-C catalog id used to configure this VCE") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="identifier of managed by ATT or customer") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Address tail-f uses to configure generic-vnf, also used for troubleshooting and is IP used for traps generated by generic-vnf.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="v4 Loopback0 address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="v6 Loopback address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="v6 management address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="number of vcpus ordered for this instance of VNF, used for VNFs with no vservers/flavors, to be used only by uCPE") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="units associated with vcpu, used for VNFs with no vservers/flavors, to be used only by uCPE") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="number of GB of memory ordered for this instance of VNF, used for VNFs with no vservers/flavors, to be used only by uCPE") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="units associated with vmemory, used for VNFs with no vservers/flavors, to be used only by uCPE") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="number of vdisks ordered for this instance of VNF, used for VNFs with no vservers/flavors, to be used only uCPE") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="units associated with vdisk, used for VNFs with no vservers/flavors, to be used only by uCPE") + + + + + + + @org.openecomp.aai.annotations.Metadata(defaultValue="false",description="used to indicate whether or not this object is in maintenance mode (maintenance mode = true). This field (in conjunction with prov-status) is used to suppress alarms and vSCL on VNFs/VMs.") + + + + + + + @org.openecomp.aai.annotations.Metadata(defaultValue="false",description="used to indicate whether closed loop function is enabled on this node") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="details regarding the generic-vnf operation, PLEASE DISCONTINUE USE OF THIS FIELD.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="indicates whether generic-vnf access uses SSH") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC model id for this resource or service model.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC model version uuid for this resource or service model.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="captures the id of all the configuration used to customize the resource for the service.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC data dictionary widget model. This maps directly to the A&AI widget.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="the ASDC data dictionary version of the widget model.This maps directly to the A&AI version of the widget.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="as-number of the VNF") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="represents sub zone of the rr plane") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Generic description of the type of the resource") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Role that this asset will be playing in its context.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="English description of function that the specific resource deployment is providing. Assigned as part of the customization of a resource in a service") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Short code that is used in naming instances of the item being modelled") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Path to the controller object.") + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of VNFs") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="LAG links can connect lag-interfaces",indexedProps="link-name",container="lag-links",namespace="network") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Alphabetical concatenation of lag-interface names") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of link aggregation connections") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="This object fills in the gaps from vce that were incorporated into generic-vnf. This object will be retired with vce.",nameProps="vnf-name",indexedProps="vnf-name,vnf-name2,vnf-type,heat-stack-id,prov-status,vnf-id2",searchable="vnf-id2,vnf-name,vnf-name2",uniqueProps="vnf-id2",container="newvces",namespace="network") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique id of VNF, can't use same attribute name right now until we promote this new object") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Name of VNF.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Alternate name of VNF.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="String capturing type of vnf, that was intended to identify the ASDC resource. This field has been overloaded in service-specific ways and clients should expect changes to occur in the future to this field as ECOMP matures.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Trigger for operational monitoring of this VNF by BAU Service Assurance systems.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Status that indicates whether the asset is in or out of the service path. Valid values are null, in-service-path, out-of-service-path.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="OBSOLETE - do not use") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Address tail-f uses to configure vpe, also used for troubleshooting and is IP used for traps generated by VPE (v4-loopback0-ip-address).") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Client should send valid enumerated value, e.g., VPE.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="v4 Loopback0 address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Orchestration status of this VNF, mastered by MSO.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Heat stack id corresponding to this instance, managed by MSO") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Corresponds to the SDN-C catalog id used to configure this VCE") + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="This object fills in the gaps from vce that were incorporated into generic-vnf. This object will be retired with vce.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="PNF represents a physical network function. typically equipment used in the D1 world. in 1607, this will be populated by SDN-C to represent a premises router that a uCPE connects to. But this can be used to represent any physical device that is not an AIC node or uCPE.",indexedProps="pnf-name,orchestration-status,inv-status",searchable="pnf-name",uniqueProps="pnf-name",container="pnfs",namespace="network") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="unique name of Physical Network Function.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="name of Physical Network Function.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="source of name2") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="id of pnf") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Equipment type. Source of truth should define valid values.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Equipment vendor. Source of truth should define valid values.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Equipment model. Source of truth should define valid values.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="identifier of managed by ATT or customer") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="ipv4-oam-address with new naming convention for IP addresses") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="sw-version is the version of SW for the hosted application on the PNF.") + + + + + + + @org.openecomp.aai.annotations.Metadata(defaultValue="false",description="Used to indicate whether or not this object is in maintenance mode (maintenance mode = true). This field (in conjunction with prov-status) is used to suppress alarms and vSCL on VNFs/VMs.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="ID of the physical frame (relay rack) where pnf is installed.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Serial number of the device") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="IPV4 Loopback 0 address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="IPV6 Loopback 0 address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="IPV4 AIM address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="IPV6 AIM address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="IPV6 OAM address") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="CANOPI's inventory status. Only set with values exactly as defined by CANOPI.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Prov Status of this device (not under canopi control) Valid values [PREPROV/NVTPROV/PROV]") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Nf Role is the role performed by this instance in the network.") + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of Physical Network Functions.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of physical connections, typically between p-interfaces",indexedProps="circuit-id,link-name",alternateKeys1="circuit-id",container="physical-links",namespace="network",searchable="link-name,circuit-id") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="e.g., hostnameA_p-connection_nameA_hostnameZ+p_connection-nameZ") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Captures the numeric part of the speed") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Captures the units corresponding to the speed") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Circuit it") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Dual access mode (e.g., primary, secondary") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="To provide information on who manages this circuit. A&AI or 3rd party transport provider") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Name of the service Provider on this link.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of physical connections, typically between p-interfaces") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="vig-server contains information about a vig server used for IPSec-configuration. Populated by SDN-C from 1607",indexedProps="vig-address-type",dependentOn="ipsec-configuration",container="vig-servers") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="indicates whether the VIG is for AVPN or INTERNET") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="v4 IP of the vig server") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="v6 IP of the vig server") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="IPSec configuration node will contain various configuration data for the NMTE VNF. This node will have an edge to the generic-vnf (vnf type = TE). Starting 1607, this data will be populated by SDN-C",indexedProps="ipsec-configuration-id",uniqueProps="ipsec-configuration-id",container="ipsec-configurations",namespace="network") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="UUID of this configuration") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Indicate the type of VIG server like AVPN, INTERNET, BOTH") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Encryption values like 3des-cbc, des-cbc, aes-128-cbc, aes-192-cbc, aes-265-cbc") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="ATT can offer a shared DMZ or a DMZ specific to a customer") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Network address of shared DMZ") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="If the DMZ is a custom DMZ, this field will indicate the customer information") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="can be 1 or 2") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Contains values like md5, sha1, sha256, sha384") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Encyption values like 3des-cbc, des-cbc, aes-128-cbc, aes-192-cbc, aes-265-cbc") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Diffie-Hellman group like DH-GROUP2, DH-GROUP5, DH-GROUP14") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Group name defined in VIG for clients using aggressive mode") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="pre-shared key for the above group name ") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Lifetime for IKEv1 SA") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="md5, sha1, sha256, sha384") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="3des-cbc, des-cbc, aes-128-cbc, aes-192-cbc, aes-265-cbc") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Life time for IPSec SA") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="enable PFS or not") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="user ID for xAuth, sm-user,ucpeHostName,nmteHostName") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Encrypted using the Juniper $9$ algorithm") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="The time between DPD probe") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Maximum number of DPD before claiming the tunnel is down") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Openstack route table reference.",nameProps="route-table-reference-fqdn",uniqueProps="route-table-reference-id",indexedProps="route-table-reference-id,route-table-reference-fqdn",container="route-table-references",namespace="network") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Route Table Reference id, UUID assigned to this instance.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="FQDN entry in the route table.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Concurrency value") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of openstack route table references") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="General mechanism for grouping instances",nameProps="description",uniqueProps="id",indexedProps="id,description,type,sub-type",container="instance-groups",namespace="network") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Instance Group ID, UUID assigned to this instance.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Descriptive text to help identify the usage of this instance-group") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Only valid value today is lower case ha for high availability") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Valid values for ha type are [geo-activeactive, geo-activestandby, local-activeactive, local-activestandby]") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Concurrency value") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of openstack route table references") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="A zone is a grouping of assets in a location homing to the same connections into the CBB",nameProps="zone-name",indexedProps="zone-id,design-type,zone-context",uniqueProps="zone-id",container="zones",namespace="network") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Code assigned by AIC to the zone") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="English name associated with the zone") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Design of zone [Medium/Large…]") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Context of zone [production/test]") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Status of a zone.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Concurrency value") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Collection of zones") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Namespace for network inventory resources.") + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Internal map to define some reserved properties of a vertex",uniqueProps="aai-unique-key",indexedProps="aai-unique-key,source-of-truth,aai-node-type,aai-uri") + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Internal map to define the properties of an edge and interpret the map EdgeRules",edgeInfo="edgeLabel,direction,multiplicityRule,isParent,usesResource,hasDelTarget,SVC-INFRA,SVC-INFRA-REV") + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Allows for legacy POST of old-style and new-style models") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique identifier corresponding to the main definition of a model in ASDC") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique identifier corresponding to one version of a model in ASDC") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Type of the model, e.g., service, resource, widget, etc.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Name of the model, which can change from version to version.") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Invariant unique ID which does not change from version to version") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Version") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Description") + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Used for optimistic concurrency. Must be empty on create, valid on update and delete.") + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="QueryParameters for performing a named-query or model query") + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="InstanceFilters for performing a named-query or model query") + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="SecondaryFilts for performing a named-query or model query") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="ModelAndNamedQuerySearch holds query-parameters and instance-properties for performing a named-query or model query") + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Property holder for query properties or instance properties") + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Inventory item for response list",container="inventory-response-items") + + + + + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Container for inventory items in response list",container="response-list") + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Response container for the results of a named-query or model query") + + + + + + + + + + + + + + + + + + + @org.openecomp.aai.annotations.Metadata(description="Abstract vnf class",indexedProps="vnf-id",uniqueProps="vnf-id",inheritors="vce,vpe,generic-vnf",isAbstract="true") + + + + + + + @org.openecomp.aai.annotations.Metadata(isKey=true,description="Unique id of VNF. This is unique across the graph.") + + + + + + + diff --git a/aai-service/provider/src/test/java/org/openecomp/sdnc/sli/aai/r1607/R1607AutoGeneratedTest.java b/aai-service/provider/src/test/java/org/openecomp/sdnc/sli/aai/r1607/R1607AutoGeneratedTest.java new file mode 100644 index 00000000..15a7647e --- /dev/null +++ b/aai-service/provider/src/test/java/org/openecomp/sdnc/sli/aai/r1607/R1607AutoGeneratedTest.java @@ -0,0 +1,489 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.r1607; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; + +import java.io.File; +import java.io.IOException; +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import javax.xml.bind.SchemaOutputResolver; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.transform.Result; +import javax.xml.transform.stream.StreamResult; + +import org.apache.commons.lang.RandomStringUtils; +import org.apache.commons.lang.StringUtils; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.FixMethodOrder; +import org.junit.runners.MethodSorters; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource.QueryStatus; +import org.openecomp.aai.inventory.v10.GenericVnf; +import org.openecomp.aai.inventory.v10.InventoryResponseItems; +import org.openecomp.sdnc.sli.aai.AAIClient; +import org.openecomp.sdnc.sli.aai.AAIDeclarations; +import org.openecomp.sdnc.sli.aai.AAIRequest; +import org.openecomp.sdnc.sli.aai.AAIService; +import org.openecomp.sdnc.sli.aai.data.AAIDatum; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.ObjectMapper; + + + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class R1607AutoGeneratedTest { + + private static final Logger LOG = LoggerFactory.getLogger(R1607AutoGeneratedTest.class); + + protected static AAIClient client; + + protected Map cache = new HashMap(); + + @BeforeClass + public static void setUp() throws Exception { +// super.setUp(); + URL url = AAIService.class.getResource(AAIService.AAICLIENT_PROPERTIES); + client = new AAIService(url); + LOG.info("\nTaicAAIResourceTest.setUp\n"); + } + + @AfterClass + public static void tearDown() throws Exception { +// super.tearDown(); + client = null; + LOG.info("----------------------- AAIResourceTest.tearDown -----------------------"); + } + + +// @Test + public void test01AutoGeneratedRequest() { + + String[] requestDefinition = { + "query|generic-vnf|generic-vnf.vnf-id:assign:value:bnfm0001v-1147" + }; + + for(String line : requestDefinition){ + // parse request line resource | key structure + String[] segments = line.split("\\|"); + String action = segments[0]; + String resource = segments[1]; + String[] tmpKeys = segments[2].split("&"); + + + String localId = null; + + List keys = new ArrayList(); + 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; + } + + 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; + } + + } + + switch(action){ + case "save": + List x = Arrays.asList(localId.split("\\.")); + + testAutoGeneratedSaveRequest(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 requestKeys, String identifier, String idValue) { + LOG.info("----------------------- Test: " + new Object(){}.getClass().getEnclosingMethod().getName() + " -----------------------"); + + try + { + Map nameValues = keyToHashMap(StringUtils.join(requestKeys, " AND "), new SvcLogicContext()); + AAIRequest request = AAIRequest.createRequest(resource, nameValues); + Class resourceClass = (Class) (request==null ? GenericVnf.class : request.getModelClass()); + + Map data = new HashMap(); + + for(Field field : resourceClass.getDeclaredFields()) { + 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); + } 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); + } + } + } + } + + SvcLogicContext ctx = new SvcLogicContext(); + + data.remove("resource-version"); + + QueryStatus resp = null; + + //(String resource, boolean force, boolean localOnly, String key, Map parms, String prefix, SvcLogicContext ctx) + resp = client.save(resource, false, false, StringUtils.join(requestKeys, " AND "), data, "aaidata", ctx); + } + catch (Throwable e) + { + LOG.error("Caught exception", e); + fail("Caught exception"); + } + } + + public void test03AutoGeneratedQueryRequest(String resource, List 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); + } + catch (Throwable e) + { + LOG.error("Caught exception", e); + fail("Caught exception"); + } + } + + + public void test03AutoGeneratedDeleteRequest(String resource, List 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); + } + catch (Throwable e) + { + LOG.error("Caught exception", e); + fail("Caught exception"); + } + } + + static ArrayList findSetters(Class c) { + ArrayList list = new ArrayList(); + 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 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+"); + + StringBuffer whereBuff = new StringBuffer(); + String term1 = null; + String op = null; + String term2 = null; + HashMap results = new HashMap(); + + 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 test04VceDataPost() { + LOG.info("----------------------- Test: " + new Object(){}.getClass().getEnclosingMethod().getName() + " -----------------------"); + + try + { + URL resource = this.getClass().getResource("/json/tails4.json"); + + LOG.info("Resource is " + resource.getFile()); + File requestFile = new File(resource.getFile()); + if(!requestFile.exists()) { + fail("Test file does not exist"); + } + SvcLogicContext ctx = new SvcLogicContext(); + ObjectMapper mapper = AAIService.getObjectMapper(); + InventoryResponseItems request = mapper.readValue(requestFile, InventoryResponseItems.class); + Map subnetsList = mapper.convertValue(request, Map.class); + AAIDeclarations.class.cast(client).writeMap(subnetsList, "aaiTmp", ctx); + assertNotNull(request); + + } + catch (Exception e) + { + LOG.error("Caught exception", e); + fail("Caught exception"); + } + } + +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; + } + + } +} diff --git a/aai-service/provider/src/test/resources/aaiclient.properties b/aai-service/provider/src/test/resources/aaiclient.properties new file mode 100644 index 00000000..260b5162 --- /dev/null +++ b/aai-service/provider/src/test/resources/aaiclient.properties @@ -0,0 +1,237 @@ +### +# ============LICENSE_START======================================================= +# openECOMP : SDN-C +# ================================================================================ +# Copyright (C) 2017 ONAP 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========================================================= +### + +# +# Configuration file for A&AI Client +# + +# +# Certificate keystore and truststore +# +org.openecomp.sdnc.sli.aai.ssl.trust=/opt/bvc/tls-client/truststore.client.jks +org.openecomp.sdnc.sli.aai.ssl.trust.psswd={truststore-password} +org.openecomp.sdnc.sli.aai.ssl.key=/opt/bvc/tls-client/keystore.client.jks +org.openecomp.sdnc.sli.aai.ssl.key.psswd={keystore-password} +org.openecomp.sdnc.sli.aai.host.certificate.ignore=true + +org.openecomp.sdnc.sli.aai.client.name=SDNC +org.openecomp.sdnc.sli.aai.client.psswd=SDNC + +org.openecomp.sdnc.sli.aai.application=openECOMP + +# +# Configuration file for A&AI Client +# +org.openecomp.sdnc.sli.aai.uri=https://localhost:8443 + + +# query +org.openecomp.sdnc.sli.aai.path.query=/aai/v10/search/sdn-zone-query +org.openecomp.sdnc.sli.aai.query.nodes=/aai/v10/search/nodes-query?search-node-type={node-type}&filter={entity-identifier}:EQUALS:{entity-name} +org.openecomp.sdnc.sli.aai.query.generic=/aai/v10/search/generic-query?key={identifier}:{value}&start-node-type={start-node-type}&include=complex&depth=3 + +# named query +org.openecomp.sdnc.sli.aai.query.named=/aai/search/named-query + + +#update +org.openecomp.sdnc.sli.aai.update=/aai/v10/actions/update + +# vce +org.openecomp.sdnc.sli.aai.path.vce =/aai/v10/network/vces/vce/ +org.openecomp.sdnc.sli.aai.path.vces=/aai/v10/network/vces/ + +# customer +org.openecomp.sdnc.sli.aai.path.customer=/aai/v10/business/customers/customer/{customer-id} + +# service subscription +org.openecomp.sdnc.sli.aai.path.service.subscription=/aai/v10/business/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type} + +# service instance +org.openecomp.sdnc.sli.aai.path.svcinst=/aai/v10/business/customers/customer/{customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances +org.openecomp.sdnc.sli.aai.path.svcinst.query=/aai/v10/search/generic-query?key=service-instance.service-instance-id:{svc-instance-id}&start-node-type=service-instance&include=service-instance +org.openecomp.sdnc.sli.aai.path.service.instance=/aai/v10/business/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances/service-instance/{service-instance-id} + +# tenant +org.openecomp.sdnc.sli.aai.path.tenant=/aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/tenants/tenant/{tenant-id} +org.openecomp.sdnc.sli.aai.path.tenant.query=/aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/tenants/tenant?tenant-name={tenant-name} + +# vservers +org.openecomp.sdnc.sli.aai.path.vservers=/aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/tenants/tenant/{tenant-id}/vservers/ +org.openecomp.sdnc.sli.aai.path.vserver=/aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/tenants/tenant/{tenant-id}/vservers/vserver/{vserver-id} + +# vpls-pe +org.openecomp.sdnc.sli.aai.path.vpls.pes=/aai/v10/network/vpls-pes/ +org.openecomp.sdnc.sli.aai.path.vpls.pe =/aai/v10/network/vpls-pes/vpls-pe/ + +# ctag-pool +org.openecomp.sdnc.sli.aai.path.ctag.pools=/aai/v10/cloud-infrastructure/complexes/complex/{physical-location-id}/ctag-pools +org.openecomp.sdnc.sli.aai.path.ctag.pool=/aai/v10/cloud-infrastructure/complexes/complex/{physical-location-id}/ctag-pools/ctag-pool/{target-pe}/{availability-zone-name} + +# +#-------------- 1510 ---------------------- +# + +# pservers +org.openecomp.sdnc.sli.aai.path.pservers=/aai/v10/cloud-infrastructure/pservers +org.openecomp.sdnc.sli.aai.path.pserver=/aai/v10/cloud-infrastructure/pservers/pserver/{hostname} + +# generic-vnf +#org.openecomp.sdnc.sli.aai.path.generic.vnfs=/aai/v10/network/generic-vnfs +#org.openecomp.sdnc.sli.aai.path.generic.vnf=/aai/v10/network/generic-vnfs/generic-vnf/{vnf-id} + +# dvs-switch +org.openecomp.sdnc.sli.aai.path.dvsswitches=/aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/dvs-switches +org.openecomp.sdnc.sli.aai.path.dvsswitch=/aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/dvs-switches/dvs-switch/{switch-name} + +# L3 Networks +org.openecomp.sdnc.sli.aai.path.l3networks=/aai/v10/network/l3-networks +org.openecomp.sdnc.sli.aai.path.l3network=/aai/v10/network/l3-networks/l3-network/{network-id} +org.openecomp.sdnc.sli.aai.path.l3network.query.name=/aai/v10/network/l3-networks/l3-network?network-name={network-name} + +# P-Interfaces +org.openecomp.sdnc.sli.aai.path.pserver.pinterfaces=/aai/v10/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces +org.openecomp.sdnc.sli.aai.path.pserver.pinterface=/aai/v10/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces/p-interface/{interface-name} + +# Physical Link +org.openecomp.sdnc.sli.aai.path.physical.links=/aai/v10/network/physical-links +org.openecomp.sdnc.sli.aai.path.physical.link=/aai/v10/network/physical-links/physical-link/{link-name} + +# VPN Bindings +org.openecomp.sdnc.sli.aai.path.vpn.bindings=/aai/v10/network/vpn-bindings/ +org.openecomp.sdnc.sli.aai.path.vpn.binding=/aai/v10/network/vpn-bindings/vpn-binding/{vpn-id} + +# VNF IMAGES +org.openecomp.sdnc.sli.aai.path.vnf.images=/aai/v10/service-design-and-creation/vnf-images +org.openecomp.sdnc.sli.aai.path.vnf.image=/aai/v10/service-design-and-creation/vnf-images/vnf-image/{att-uuid} +org.openecomp.sdnc.sli.aai.path.vnf.image.query=/aai/v10/service-design-and-creation/vnf-images/vnf-image?application={application_model}&application-vendor={application_vendor} + +# UBB Notify +org.openecomp.sdnc.sli.aai.path.notify=/aai/v10/actions/notify +org.openecomp.sdnc.sli.aai.notify.selflink.fqdn=https://sdncodl.it.us.aic.cip.att.com:8443/restconf/config/L3SDN-API:services/layer3-service-list/{service-instance-id} +org.openecomp.sdnc.sli.aai.notify.selflink.avpn=https://sdncodl-conexus.it.us.02.aic.cip.att.com:8543/restconf/config/L3AVPN-EVC-API:services/service-list/{service-instance-id}/service-data/avpn-logicalchannel-information + +# Service +org.openecomp.sdnc.sli.aai.path.service=/aai/v10/service-design-and-creation/services/service/{service-id} +org.openecomp.sdnc.sli.aai.path.services=/aai/v10/service-design-and-creation/services + + +# +#-------------- 1604 ---------------------- +# + +# VNFC +org.openecomp.sdnc.sli.aai.path.vnfc=/aai/v10/network/vnfcs/vnfc/{vnfc-name} + +# site-pair +org.openecomp.sdnc.sli.aai.path.site.pair=/aai/v10/network/site-pair-sets/site-pair-set/{site-pair-set-id}/routing-instances/routing-instance/{routing-instance-id}/site-pairs/site-pair/{site-pair-id} + +# routing-instance +org.openecomp.sdnc.sli.aai.path.routing.instance=/aai/v10/network/site-pair-sets/site-pair-set/{site-pair-set-id}/routing-instances/routing-instance/{routing-instance-id} + +# site-pair-set +org.openecomp.sdnc.sli.aai.path.site.pair.set=/aai/v10/network/site-pair-sets/site-pair-set/{site-pair-set-id} + +# license key resource +org.openecomp.sdnc.sli.aai.path.license.acquire=/aai/v10/actions/assignment/license-management/assignment-group-uuid/{assignment-group-uuid} +org.openecomp.sdnc.sli.aai.path.license=/aai/v10/license-management/license-key-resources/license-key-resource/{att-uuid} + +# logical-link +org.openecomp.sdnc.sli.aai.path.logical.link =/aai/v10/network/logical-links/logical-link/{link-name} + +# virtual-data-center +org.openecomp.sdnc.sli.aai.path.virtual.data.center=/aai/v10/cloud-infrastructure/virtual-data-centers/virtual-data-center/{vdc-id} + +# wan-connector +org.openecomp.sdnc.sli.aai.path.wan.connector=/aai/v10/business/connectors/connector/{resource-instance-id} + +# l-interface +org.openecomp.sdnc.sli.aai.path.lag.interface.l.interface=/aai/v10/cloud-infrastructure/pservers/pserver/{hostname}/lag-interfaces/lag-interface/{lag-interface.interface-name}/l-interfaces/l-interface/{interface-name} +org.openecomp.sdnc.sli.aai.path.p.interface.l.interface=/aai/v10/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces/p-interface/{p-interface.interface-name}/l-interfaces/l-interface/{interface-name} + +# l-interface pnf +org.openecomp.sdnc.sli.aai.path.lag.interface.l.interface.pnf=/aai/v10/network/pnfs/pnf/{pnf-name}/lag-interfaces/lag-interface/{lag-interface.interface-name}/l-interfaces/l-interface/{interface-name} +org.openecomp.sdnc.sli.aai.path.p.interface.l.interface.pnf=/aai/v10/network/pnfs/pnf/{pnf-name}/p-interfaces/p-interface/{p-interface.interface-name}/l-interfaces/l-interface/{interface-name} + +# subinterface +org.openecomp.sdnc.sli.aai.path.pnf.lag.interface.subinterface=/aai/v10/network/pnfs/pnf/{pnf-name}/lag-interfaces/lag-interface/{lag-interface.interface-name}/l-interfaces/l-interface/{interface-name} +org.openecomp.sdnc.sli.aai.path.pnf.p.interface.l.interface=/aai/v10/network/pnfs/pnf/{pnf-name}/p-interfaces/p-interface/{p-interface.interface-name}/l-interfaces/l-interface/{interface-name} + +# l3-interface-ipv4-address-list +org.openecomp.sdnc.sli.aai.path.l3.interface.ipv4.address.list=/aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} +org.openecomp.sdnc.sli.aai.path.vlan.l3.interface.ipv4.address.list=/aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + +# l3-interface-ipv6-address-list +org.openecomp.sdnc.sli.aai.path.l3.interface.ipv6.address.list=/aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} +org.openecomp.sdnc.sli.aai.path.vlan.l3.interface.ipv6.address.list=/aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + +# ipsec-configuration +org.openecomp.sdnc.sli.aai.path.ipsec.configuration=/aai/v10/network/ipsec-configurations/ipsec-configuration/{ipsec-configuration-id} + +# vig server +org.openecomp.sdnc.sli.aai.path.vig.server=/aai/v10/network/ipsec-configurations/ipsec-configuration/{ipsec-configuration-id}/vig-servers/vig-server/{vig-address-type} + +# l3-network +org.openecomp.sdnc.sli.aai.path.l3.network=/aai/v10/network/l3-networks/l3-network/{network-id} + +# subnet +org.openecomp.sdnc.sli.aai.path.subnet=/aai/v10/network/l3-networks/l3-network/{network-id}/subnets/subnet/{subnet-id} + +# multicast-configuration +org.openecomp.sdnc.sli.aai.path.multicast.configuration=/aai/v10/network/multicast-configurations/multicast-configuration/{multicast-configuration-id} + +# org.openecomp.sdnc.sli.aai.path.l.interface.ipv4.address.list +org.openecomp.sdnc.sli.aai.path.l3-interface.ipv4.address.list=/aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + +# org.openecomp.sdnc.sli.aai.path.l.interface.vlan.ipv4.address.list +org.openecomp.sdnc.sli.aai.path.l3-interface.vlan.ipv4.address.list=/aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/l-interfaces/l-interface/{interface-name}/vlans/vlan/{vlan-interface}/l3-interface-ipv4-address-list/{l3-interface-ipv4-address} + +# org.openecomp.sdnc.sli.aai.path.l.interface.ipv6.address.list +org.openecomp.sdnc.sli.aai.path.l3-interface.ipv6.address.list=/aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/l-interfaces/l-interface/{interface-name}/l3-interface-ipv6-address-list/{l3-interface-ipv6-address} + +# volume.group +org.openecomp.sdnc.sli.aai.path.volume.group=/aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/volume-groups/volume-group/{volume-group-id} + +#cloud region +org.openecomp.sdnc.sli.aai.path.cloud.region=/aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id} + +# vf-module +org.openecomp.sdnc.sli.aai.path.vf.module=/aai/v10/network/generic-vnfs/generic-vnf/{vnf-id}/vf-modules/vf-module/{vf-module-id} + +# network-policy +org.openecomp.sdnc.sli.aai.path.network.policy=/aai/v10/network/network-policies/network-policy/{network-policy-id} + +# pnf +org.openecomp.sdnc.sli.aai.path.pnf=/aai/v10/network/pnfs/pnf/{pnf-name} + +# oam-network +org.openecomp.sdnc.sli.aai.path.oam.network=/aai/v10/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/oam-networks/oam-network/{network-uuid} + +# route-table-reference +org.openecomp.sdnc.sli.aai.path.route.table.reference=/aai/v10/network/route-table-references/route-table-reference/{route-table-reference-id} + +# +# Formatting +# +org.openecomp.sdnc.sli.aai.param.format=filter=%s:%s +org.openecomp.sdnc.sli.aai.param.vnf_type=vnf-type +org.openecomp.sdnc.sli.aai.param.physical.location.id=physical-location-id +org.openecomp.sdnc.sli.aai.param.service.type=service-type diff --git a/example-settings.xml b/example-settings.xml new file mode 100644 index 00000000..2e7ce644 --- /dev/null +++ b/example-settings.xml @@ -0,0 +1,163 @@ + + + + + + + + openecomp-release + + + openecomp-release + openecomp-release + https://ecomp-nexus:8443/repository/maven-releases/ + + true + never + + + false + + + + + + openecomp-release + openecomp-release + https://ecomp-nexus:8443/repository/maven-releases/ + + true + never + + + false + + + + + + + openecomp-snapshots + + + openecomp-snapshot + openecomp-snapshot + https://ecomp-nexus:8443/repository/maven-snapshots/ + + false + + + true + + + + + + openecomp-snapshot + openecomp-snapshot + https://ecomp-nexus:8443/repository/maven-snapshots/ + + false + + + true + + + + + + opendaylight-release + + + opendaylight-mirror + opendaylight-mirror + https://nexus.opendaylight.org/content/repositories/public/ + + true + never + + + false + + + + + + opendaylight-mirror + opendaylight-mirror + https://nexus.opendaylight.org/content/repositories/public/ + + true + never + + + false + + + + + + + opendaylight-snapshots + + + opendaylight-snapshot + opendaylight-snapshot + https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/ + + false + + + true + + + + + + opendaylight-snapshot + opendaylight-snapshot + https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/ + + false + + + true + + + + + + + + openecomp-release + openecomp-snapshots + opendaylight-release + opendaylight-snapshots + + + + + nexus + USERNAME + PASSWORD + + + openecomp-release + USERNAME + PASSWORD + + + openecomp-snapshot + USERNAME + PASSWORD + + + diff --git a/jenkins-settings.xml b/jenkins-settings.xml new file mode 100644 index 00000000..344994f8 --- /dev/null +++ b/jenkins-settings.xml @@ -0,0 +1,168 @@ + + + + + + + + openecomp-release + + + openecomp-release + openecomp-release + https://ecomp-nexus:8443/repository/maven-releases/ + + true + never + + + false + + + + + + openecomp-release + openecomp-release + https://ecomp-nexus:8443/repository/maven-releases/ + + true + never + + + false + + + + + + + openecomp-snapshots + + + openecomp-snapshot + openecomp-snapshot + https://ecomp-nexus:8443/repository/maven-snapshots/ + + false + + + true + + + + + + openecomp-snapshot + openecomp-snapshot + https://ecomp-nexus:8443/repository/maven-snapshots/ + + false + + + true + + + + + + opendaylight-release + + + opendaylight-mirror + opendaylight-mirror + https://nexus.opendaylight.org/content/repositories/public/ + + true + never + + + false + + + + + + opendaylight-mirror + opendaylight-mirror + https://nexus.opendaylight.org/content/repositories/public/ + + true + never + + + false + + + + + + + opendaylight-snapshots + + + opendaylight-snapshot + opendaylight-snapshot + https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/ + + false + + + true + + + + + + opendaylight-snapshot + opendaylight-snapshot + https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/ + + false + + + true + + + + + + + + openecomp-release + openecomp-snapshots + opendaylight-release + opendaylight-snapshots + + + + + nexus + ${ecomp.nexus.user} + ${ecomp.nexus.password} + + + openecomp-release + ${ecomp.nexus.user} + ${ecomp.nexus.password} + + + openecomp-snapshot + ${ecomp.nexus.user} + ${ecomp.nexus.password} + + + sdnc-javadoc + ${ecomp.nexus.user} + ${ecomp.nexus.password} + + + diff --git a/mdsal-resource/.gitignore b/mdsal-resource/.gitignore new file mode 100755 index 00000000..b73caf31 --- /dev/null +++ b/mdsal-resource/.gitignore @@ -0,0 +1,34 @@ +#####standard .git ignore entries##### + +## IDE Specific Files ## +org.eclipse.core.resources.prefs +.classpath +.project +.settings +.idea +.externalToolBuilders +maven-eclipse.xml +workspace + +## Compilation Files ## +*.class +**/target +target +target-ide +MANIFEST.MF + +## Misc Ignores (OS specific etc) ## +bin/ +dist +*~ +*.ipr +*.iml +*.iws +classes +out/ +.DS_STORE +.metadata + +## Folders which contain auto generated source code ## +yang-gen-config +yang-gen-sal diff --git a/mdsal-resource/features/pom.xml b/mdsal-resource/features/pom.xml new file mode 100755 index 00000000..3848f1a6 --- /dev/null +++ b/mdsal-resource/features/pom.xml @@ -0,0 +1,134 @@ + + + 4.0.0 + + mdsal-resource + org.openecomp.sdnc.adaptors + 0.0.1-SNAPSHOT + + mdsal-resource-features + MD-SAL Resource Adaptor - Features + + jar + + + + + + org.openecomp.sdnc.adaptors + mdsal-resource-provider + ${project.version} + + + + commons-lang + commons-lang + 2.6 + compile + + + + org.opendaylight.mdsal + features-mdsal + ${odl.mdsal.features.version} + features + xml + + runtime + + + + + + org.opendaylight.odlparent + opendaylight-karaf-empty + ${odl.karaf.empty.distro.version} + zip + + + + + + org.opendaylight.odlparent + features-test + ${odl.commons.opendaylight.version} + test + + + + org.opendaylight.yangtools + features-yangtools + ${odl.yangtools.version} + features + xml + runtime + + + + + + + true + src/main/resources + + + + + org.apache.maven.plugins + maven-resources-plugin + + + filter + + resources + + generate-resources + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + attach-artifacts + + attach-artifact + + package + + + + ${project.build.directory}/classes/${features.file} + xml + features + + + + + + + + + diff --git a/mdsal-resource/features/src/main/resources/features.xml b/mdsal-resource/features/src/main/resources/features.xml new file mode 100644 index 00000000..5f4a954b --- /dev/null +++ b/mdsal-resource/features/src/main/resources/features.xml @@ -0,0 +1,38 @@ + + + + + + + mvn:org.opendaylight.mdsal/features-mdsal/${odl.mdsal.features.version}/xml/features + + + + + odl-mdsal-broker + sdnc-sli + mvn:org.openecomp.sdnc.adaptors/mdsal-resource-provider/${project.version} + + + diff --git a/mdsal-resource/installer/pom.xml b/mdsal-resource/installer/pom.xml new file mode 100755 index 00000000..322a8daa --- /dev/null +++ b/mdsal-resource/installer/pom.xml @@ -0,0 +1,138 @@ + + + 4.0.0 + + mdsal-resource + org.openecomp.sdnc.adaptors + 0.0.1-SNAPSHOT + + mdsal-resource-installer + MDSAL Resource - Karaf Installer + pom + + + sdnc-mdsal-resource + sdnc-mdsal-resource + mvn:org.openecomp.sdnc.adaptors/mdsal-resource-features/${project.version}/xml/features + false + + + + + + org.openecomp.sdnc.adaptors + mdsal-resource-features + ${project.version} + features + xml + + + * + * + + + + + + org.openecomp.sdnc.adaptors + mdsal-resource-provider + ${project.version} + + + + + + + + maven-assembly-plugin + 2.6 + + + maven-repo-zip + + single + + package + + false + stage/${application.name}-${project.version} + + src/assembly/assemble_mvnrepo_zip.xml + + false + + + + installer-zip + + single + + package + + true + ${application.name}-${project.version}-installer + + src/assembly/assemble_installer_zip.xml + + false + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + + copy-dependencies + + prepare-package + + false + ${project.build.directory}/assembly/system + false + true + true + true + false + false + org.openecomp.sdnc + sli-common,sli-provider,dblib-provider + provided + + + + + + maven-resources-plugin + 2.6 + + + copy-version + + copy-resources + + validate + + ${basedir}/target/stage + + + src/main/resources/scripts + + install-feature.sh + + true + + + + + + + + + + + + diff --git a/mdsal-resource/installer/src/assembly/assemble_installer_zip.xml b/mdsal-resource/installer/src/assembly/assemble_installer_zip.xml new file mode 100644 index 00000000..e278872a --- /dev/null +++ b/mdsal-resource/installer/src/assembly/assemble_installer_zip.xml @@ -0,0 +1,59 @@ + + + + + + installer_zip + + zip + + + + false + + + + target/stage/ + ${application.name} + 755 + + *.sh + + + + target/stage/ + ${application.name} + 644 + + *.sh + + + + + + + diff --git a/mdsal-resource/installer/src/assembly/assemble_mvnrepo_zip.xml b/mdsal-resource/installer/src/assembly/assemble_mvnrepo_zip.xml new file mode 100644 index 00000000..1edacdb6 --- /dev/null +++ b/mdsal-resource/installer/src/assembly/assemble_mvnrepo_zip.xml @@ -0,0 +1,49 @@ + + + + + + mvnrepo_zip + + zip + + + + false + + + + target/assembly/ + . + + + + + + + + diff --git a/mdsal-resource/installer/src/main/resources/scripts/install-feature.sh b/mdsal-resource/installer/src/main/resources/scripts/install-feature.sh new file mode 100644 index 00000000..9a47d222 --- /dev/null +++ b/mdsal-resource/installer/src/main/resources/scripts/install-feature.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +### +# ============LICENSE_START======================================================= +# openECOMP : SDN-C +# ================================================================================ +# Copyright (C) 2017 ONAP 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========================================================= +### + +ODL_HOME=${ODL_HOME:-/opt/opendaylight/current} +ODL_KARAF_CLIENT=${ODL_KARAF_CLIENT:-${ODL_HOME}/bin/client} +ODL_KARAF_CLIENT_OPTS=${ODL_KARAF_CLIENT_OPTS:-"-u karaf"} +INSTALLERDIR=$(dirname $0) + +REPOZIP=${INSTALLERDIR}/${features.boot}-${project.version}.zip + +if [ -f ${REPOZIP} ] +then + unzip -d ${ODL_HOME} ${REPOZIP} +else + echo "ERROR : repo zip ($REPOZIP) not found" + exit 1 +fi + +${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:repo-add ${features.repositories} +${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:install ${features.boot} diff --git a/mdsal-resource/pom.xml b/mdsal-resource/pom.xml new file mode 100755 index 00000000..f4cdfc7e --- /dev/null +++ b/mdsal-resource/pom.xml @@ -0,0 +1,46 @@ + + + + org.openecomp.sdnc.adaptors + sdnc-adaptors + 0.0.1-SNAPSHOT + + + 4.0.0 + pom + org.openecomp.sdnc.adaptors + mdsal-resource + + + MD-SAL Resource Adaptor + The MD-SAL resource adaptor allows service logic to access persistent data from MD-SAL config and operational trees + + 0.0.1-SNAPSHOT + + + + + + org.openecomp.sdnc.adaptors + mdsal-resource-features + features + xml + ${project.version} + + + + org.openecomp.sdnc.adaptors + mdsal-resource-provider + ${project.version} + + + + + + + + provider + features + installer + + diff --git a/mdsal-resource/provider/pom.xml b/mdsal-resource/provider/pom.xml new file mode 100755 index 00000000..f41bf9c7 --- /dev/null +++ b/mdsal-resource/provider/pom.xml @@ -0,0 +1,122 @@ + + + 4.0.0 + + org.openecomp.sdnc.adaptors + mdsal-resource + 0.0.1-SNAPSHOT + + mdsal-resource-provider + bundle + MD-SAL Resource Adaptor - Provider + http://maven.apache.org + + UTF-8 + + + + + junit + junit + 3.8.1 + test + + + org.onap.ccsdk.sli.core + sli-common + ${sdnctl.sli.version} + compile + + + org.onap.ccsdk.sli.core + sli-provider + ${sdnctl.sli.version} + compile + + + equinoxSDK381 + org.eclipse.osgi + ${equinox.osgi.version} + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + jcl-over-slf4j + ${slf4j.version} + + + commons-codec + commons-codec + ${commons.codec.version} + + + + + + + + + org.apache.felix + maven-bundle-plugin + ${bundle.plugin.version} + true + + + org.openecomp.sdnc.sli.resource.mdsal + org.openecomp.sdnc.sli.resource.mdsal.MdsalResourceActivator + org.openecomp.sdnc.sli.resource.mdsal + org.openecomp.sdnc.sli.*,org.osgi.framework.*,org.slf4j.*,com.mysql.jdbc.* + + * + true + + + + + + + + + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + + com.brocade.developer + + + providermodule-plugin + + + [1.2.0.100-SNAPSHOT,) + + + process + + + + + + + + + + + + + + diff --git a/mdsal-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/mdsal/ConfigResource.java b/mdsal-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/mdsal/ConfigResource.java new file mode 100644 index 00000000..ed0ed063 --- /dev/null +++ b/mdsal-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/mdsal/ConfigResource.java @@ -0,0 +1,151 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.resource.mdsal; + +import java.util.Map; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource.QueryStatus; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; + +public class ConfigResource implements SvcLogicResource { + + private static final Logger LOG = LoggerFactory.getLogger(ConfigResource.class); + + private RestService restService; + + public ConfigResource(String sdncProtocol, String sdncHost, String sdncPort, String sdncUser, String sdncPasswd) + { + restService = new RestService(sdncProtocol, sdncHost, sdncPort, sdncUser, sdncPasswd, RestService.PayloadType.XML); + } + + @Override + public QueryStatus isAvailable(String resource, String key, String prefix, SvcLogicContext ctx) throws SvcLogicException + { + return(query(resource, false, null, key, prefix, null, null)); + } + + @Override + public QueryStatus exists(String resource, String key, String prefix, SvcLogicContext ctx) throws SvcLogicException + { + + return(query(resource, false, null, key, prefix, null, null)); + + } + + @Override + public QueryStatus query(String resource, boolean localOnly, String select, String key, String prefix, + String orderBy, SvcLogicContext ctx) throws SvcLogicException { + + + String module = resource; + StringBuffer restQuery = new StringBuffer(); + + String[] keyParts = key.split("/"); + + for (String keyPart : keyParts) { + if (restQuery.length() > 0) { + restQuery.append("/"); + } + if (keyPart.startsWith("$")) { + + restQuery.append(ctx.resolve(keyPart.substring(1))); + } else { + restQuery.append(keyPart); + } + } + + String restQueryStr = restQuery.toString(); + if ((restQueryStr.startsWith("'") && restQueryStr.endsWith("'")) || + (restQueryStr.startsWith("\"") && restQueryStr.endsWith("\""))) { + restQueryStr = restQueryStr.substring(1, restQueryStr.length()-1); + } + + String urlString = "restconf/config/" + module + ":" + restQueryStr; + + LOG.info("Querying resource: " + resource + ". At URL: " + urlString); + + Document results = restService.get(urlString); + + + if (results == null) { + return(QueryStatus.NOT_FOUND); + } else { + + if (ctx != null) { + ctx.mergeDocument(prefix, results); + } + return(QueryStatus.SUCCESS); + } + + } + + @Override + public QueryStatus reserve(String resource, String select, String key, String prefix, + SvcLogicContext ctx) throws SvcLogicException { + + + return(QueryStatus.SUCCESS); + + } + + @Override + public QueryStatus release(String resource, String key, SvcLogicContext ctx) throws SvcLogicException { + + return(QueryStatus.SUCCESS); + } + + @Override + public QueryStatus delete(String arg0, String arg1, SvcLogicContext arg2) + throws SvcLogicException { + // TODO Auto-generated method stub + return(QueryStatus.SUCCESS); + } + + @Override + public QueryStatus save(String arg0, boolean arg1, boolean localOnly, String arg2, + Map arg3, String arg4, SvcLogicContext arg5) + throws SvcLogicException { + // TODO Auto-generated method stub + return(QueryStatus.SUCCESS); + } + + @Override + public QueryStatus notify(String resource, String action, String key, + SvcLogicContext ctx) throws SvcLogicException { + return(QueryStatus.SUCCESS); + } + + + public QueryStatus update(String resource, String key, + Map parms, String prefix, SvcLogicContext ctx) + throws SvcLogicException { + return(QueryStatus.SUCCESS); + } + + + +} diff --git a/mdsal-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/mdsal/MdsalResourceActivator.java b/mdsal-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/mdsal/MdsalResourceActivator.java new file mode 100644 index 00000000..ea0bab26 --- /dev/null +++ b/mdsal-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/mdsal/MdsalResourceActivator.java @@ -0,0 +1,106 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.resource.mdsal; + +import java.io.File; +import java.io.FileInputStream; +import java.util.LinkedList; +import java.util.Properties; + +import org.onap.ccsdk.sli.core.sli.ConfigurationException; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MdsalResourceActivator implements BundleActivator { + + + + private static final String SDNC_CONFIG_DIR = "SDNC_CONFIG_DIR"; + + public LinkedList registrations = new LinkedList(); + + private static final Logger LOG = LoggerFactory + .getLogger(MdsalResourceActivator.class); + + @Override + public void start(BundleContext ctx) throws Exception { + + // Read properties + Properties props = new Properties(); + + String propDir = System.getenv(SDNC_CONFIG_DIR); + if (propDir == null) { + + propDir = "/opt/sdnc/data/properties"; + } + String propPath = propDir + "/mdsal-resource.properties"; + + + File propFile = new File(propPath); + + if (!propFile.exists()) { + + throw new ConfigurationException( + "Missing configuration properties file : " + + propFile); + } + try { + + props.load(new FileInputStream(propFile)); + } catch (Exception e) { + throw new ConfigurationException( + "Could not load properties file " + propPath, e); + + } + + String sdncUser = props.getProperty("org.openecomp.sdnc.sli.resource.mdsal.sdnc-user", "admin"); + String sdncPasswd = props.getProperty("org.openecomp.sdnc.sli.resource.mdsal.sdnc-passwd", "admin"); + String sdncHost = props.getProperty("org.openecomp.sdnc.sli.resource.mdsal.sdnc-host", "localhost"); + String sdncProtocol = props.getProperty("org.openecomp.sdnc.sli.resource.mdsal.sdnc-protocol", "https"); + String sdncPort = props.getProperty("org.openecomp.sdnc.sli.resource.mdsal.sdnc-port", "8443"); + + // Advertise MD-SAL resource adaptors + SvcLogicResource impl = new ConfigResource(sdncProtocol, sdncHost, sdncPort, sdncUser, sdncPasswd); + + LOG.debug("Registering MdsalResource service "+impl.getClass().getName()); + registrations.add(ctx.registerService(impl.getClass().getName(), impl, null)); + + impl = new OperationalResource(sdncProtocol, sdncHost, sdncPort, sdncUser, sdncPasswd); + + LOG.debug("Registering MdsalResource service "+impl.getClass().getName()); + registrations.add(ctx.registerService(impl.getClass().getName(), impl, null)); + } + + @Override + public void stop(BundleContext ctx) throws Exception { + + for (ServiceRegistration registration : registrations) + { + registration.unregister(); + } + } + +} diff --git a/mdsal-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/mdsal/OperationalResource.java b/mdsal-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/mdsal/OperationalResource.java new file mode 100644 index 00000000..32323e3b --- /dev/null +++ b/mdsal-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/mdsal/OperationalResource.java @@ -0,0 +1,151 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.resource.mdsal; + +import java.util.Map; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource.QueryStatus; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; + +public class OperationalResource implements SvcLogicResource { + + private static final Logger LOG = LoggerFactory.getLogger(OperationalResource.class); + + private RestService restService; + + public OperationalResource(String sdncProtocol, String sdncHost, String sdncPort, String sdncUser, String sdncPasswd) + { + restService = new RestService(sdncProtocol, sdncHost, sdncPort, sdncUser, sdncPasswd, RestService.PayloadType.XML); + + + } + + @Override + public QueryStatus isAvailable(String resource, String key, String prefix, SvcLogicContext ctx) throws SvcLogicException + { + return(query(resource, false, null, key, prefix, null, null)); + } + + @Override + public QueryStatus exists(String resource, String key, String prefix, SvcLogicContext ctx) throws SvcLogicException + { + + return(query(resource, false, null, key, prefix, null, null)); + + } + + @Override + public QueryStatus query(String resource, boolean localOnly, String select, String key, String prefix, + String orderBy, SvcLogicContext ctx) throws SvcLogicException { + + + String module = resource; + StringBuffer restQuery = new StringBuffer(); + + String[] keyParts = key.split("/"); + + for (String keyPart : keyParts) { + if (restQuery.length() > 0) { + restQuery.append("/"); + } + if (keyPart.startsWith("$")) { + + restQuery.append(ctx.resolve(keyPart.substring(1))); + } else { + restQuery.append(keyPart); + } + } + + String restQueryStr = restQuery.toString(); + if ((restQueryStr.startsWith("'") && restQueryStr.endsWith("'")) || + (restQueryStr.startsWith("\"") && restQueryStr.endsWith("\""))) { + restQueryStr = restQueryStr.substring(1, restQueryStr.length()-1); + } + + String urlString = "restconf/operational/" + module + ":" + restQueryStr; + + LOG.info("Querying resource: " + resource + ". At URL: " + urlString); + + Document results = restService.get(urlString); + + + if (results == null) { + return(QueryStatus.NOT_FOUND); + } else { + + if (ctx != null) { + ctx.mergeDocument(prefix, results); + } + return(QueryStatus.SUCCESS); + } + + } + + @Override + public QueryStatus reserve(String resource, String select, String key, String prefix, + SvcLogicContext ctx) throws SvcLogicException { + + + return(QueryStatus.SUCCESS); + + } + + @Override + public QueryStatus release(String resource, String key, SvcLogicContext ctx) throws SvcLogicException { + + return(QueryStatus.SUCCESS); + } + + @Override + public QueryStatus delete(String arg0, String arg1, SvcLogicContext arg2) + throws SvcLogicException { + // TODO Auto-generated method stub + return(QueryStatus.SUCCESS); + } + + @Override + public QueryStatus save(String arg0, boolean arg1, boolean localOnly, String arg2, + Map arg3, String arg4, SvcLogicContext arg5) + throws SvcLogicException { + // TODO Auto-generated method stub + return(QueryStatus.SUCCESS); + } + + @Override + public QueryStatus notify(String resource, String action, String key, + SvcLogicContext ctx) throws SvcLogicException { + return(QueryStatus.SUCCESS); + } + + public QueryStatus update(String resource, String key, + Map parms, String prefix, SvcLogicContext ctx) + throws SvcLogicException { + return(QueryStatus.SUCCESS); + } + + +} diff --git a/mdsal-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/mdsal/RestService.java b/mdsal-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/mdsal/RestService.java new file mode 100644 index 00000000..21d3439d --- /dev/null +++ b/mdsal-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/mdsal/RestService.java @@ -0,0 +1,212 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.resource.mdsal; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.Authenticator; +import java.net.HttpURLConnection; +import java.net.PasswordAuthentication; +import java.net.URL; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLSession; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.apache.commons.codec.binary.Base64; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; + + + + +public class RestService { + + private static final Logger LOG = LoggerFactory.getLogger(ConfigResource.class); + + public enum PayloadType { + XML, + JSON + } + + private class SdncAuthenticator extends Authenticator { + + private String user; + private String passwd; + + SdncAuthenticator(String user, String passwd) { + this.user = user; + this.passwd = passwd; + } + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(user, passwd.toCharArray()); + } + + } + + private String user; + private String passwd; + private PayloadType payloadType; + + private String protocol; + private String host; + private String port; + + public RestService(String protocol, String host, String port, String user, String passwd, PayloadType payloadType) { + this.protocol = protocol; + this.host = host; + this.port = port; + this.user = user; + this.passwd = passwd; + this.payloadType = payloadType; + } + + private HttpURLConnection getRestConnection(String urlString, String method) throws IOException + { + + URL sdncUrl = new URL(urlString); + Authenticator.setDefault(new SdncAuthenticator(user, passwd)); + + HttpURLConnection conn = (HttpURLConnection) sdncUrl.openConnection(); + + String authStr = user+":"+passwd; + String encodedAuthStr = new String(Base64.encodeBase64(authStr.getBytes())); + + conn.addRequestProperty("Authentication", "Basic "+encodedAuthStr); + + conn.setRequestMethod(method); + + if (payloadType == PayloadType.XML) { + conn.setRequestProperty("Content-Type", "application/xml"); + conn.setRequestProperty("Accept", "application/xml"); + } else { + + conn.setRequestProperty("Content-Type", "application/json"); + conn.setRequestProperty("Accept", "application/json"); + } + + conn.setDoInput(true); + conn.setDoOutput(true); + conn.setUseCaches(false); + + return(conn); + + } + + + private Document send(String urlString, byte[] msgBytes, String method) { + Document response = null; + String fullUrl = protocol + "://" + host + ":" + port + "/" + urlString; + LOG.info("Sending REST "+method +" to "+fullUrl); + + if (msgBytes != null) { + LOG.info("Message body:\n"+msgBytes); + } + + try { + HttpURLConnection conn = getRestConnection(fullUrl, method); + + if (conn instanceof HttpsURLConnection) { + HostnameVerifier hostnameVerifier = new HostnameVerifier() { + @Override + public boolean verify(String hostname, SSLSession session) { + return true; + } + }; + ((HttpsURLConnection)conn).setHostnameVerifier(hostnameVerifier); + } + + // Write message + if (msgBytes != null) { + conn.setRequestProperty("Content-Length", ""+msgBytes.length); + DataOutputStream outStr = new DataOutputStream(conn.getOutputStream()); + outStr.write(msgBytes); + outStr.close(); + } else { + conn.setRequestProperty("Content-Length", "0"); + } + + + // Read response + BufferedReader respRdr; + + LOG.info("Response: "+conn.getResponseCode()+" "+conn.getResponseMessage()); + + + if (conn.getResponseCode() < 300) { + + respRdr = new BufferedReader(new InputStreamReader(conn.getInputStream())); + } else { + respRdr = new BufferedReader(new InputStreamReader(conn.getErrorStream())); + } + + StringBuffer respBuff = new StringBuffer(); + + String respLn; + + while ((respLn = respRdr.readLine()) != null) { + respBuff.append(respLn+"\n"); + } + respRdr.close(); + + String respString = respBuff.toString(); + + LOG.info("Response body :\n"+respString); + + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + + + response = db.parse(new ByteArrayInputStream(respString.getBytes())); + + } catch (Exception e) { + + LOG.error("Caught exception executing REST command", e); + } + + return (response); + } + + + public Document get(String urlString) { + return(send(urlString, null, "GET")); + } + + public Document delete(String urlString) { + return(send(urlString, null, "DELETE")); + } + + public Document post(String urlString, byte[] msgBytes) { + return(send(urlString, msgBytes, "POST")); + } + + public Document put(String urlString, byte[] msgBytes) { + return(send(urlString, msgBytes, "PUT")); + } +} diff --git a/mdsal-resource/provider/src/main/resources/IPV4_ADDRESS_POOL.csv b/mdsal-resource/provider/src/main/resources/IPV4_ADDRESS_POOL.csv new file mode 100755 index 00000000..30ce117b --- /dev/null +++ b/mdsal-resource/provider/src/main/resources/IPV4_ADDRESS_POOL.csv @@ -0,0 +1,9 @@ +"192.168.1.2","OAM","AVAILABLE" +"192.168.1.3","OAM","AVAILABLE" +"192.168.1.4","OAM","AVAILABLE" +"192.168.1.5","OAM","AVAILABLE" +"192.168.1.6","OAM","AVAILABLE" +"192.168.1.7","OAM","AVAILABLE" +"192.168.1.8","OAM","AVAILABLE" +"192.168.1.9","OAM","AVAILABLE" +"192.168.1.10","OAM","AVAILABLE" diff --git a/mdsal-resource/provider/src/main/resources/VLAN_ID_POOL.csv b/mdsal-resource/provider/src/main/resources/VLAN_ID_POOL.csv new file mode 100755 index 00000000..6c4b0f77 --- /dev/null +++ b/mdsal-resource/provider/src/main/resources/VLAN_ID_POOL.csv @@ -0,0 +1,22 @@ +"1100","IPAG","AVAILABLE",NULL +"1101","IPAG","AVAILABLE",NULL +"1102","IPAG","AVAILABLE",NULL +"1103","IPAG","AVAILABLE",NULL +"1104","IPAG","AVAILABLE",NULL +"1105","IPAG","AVAILABLE",NULL +"1106","IPAG","AVAILABLE",NULL +"1107","IPAG","AVAILABLE",NULL +"1108","IPAG","AVAILABLE",NULL +"1109","IPAG","AVAILABLE",NULL +"1110","IPAG","AVAILABLE",NULL +"1200","VPE","AVAILABLE",NULL +"1201","VPE","AVAILABLE",NULL +"1202","VPE","AVAILABLE",NULL +"1203","VPE","AVAILABLE",NULL +"1204","VPE","AVAILABLE",NULL +"1205","VPE","AVAILABLE",NULL +"1206","VPE","AVAILABLE",NULL +"1207","VPE","AVAILABLE",NULL +"1208","VPE","AVAILABLE",NULL +"1209","VPE","AVAILABLE",NULL +"1210","VPE","AVAILABLE",NULL diff --git a/mdsal-resource/provider/src/main/resources/crtables.sql b/mdsal-resource/provider/src/main/resources/crtables.sql new file mode 100644 index 00000000..a5dea5bf --- /dev/null +++ b/mdsal-resource/provider/src/main/resources/crtables.sql @@ -0,0 +1,70 @@ +--- +-- ============LICENSE_START======================================================= +-- openECOMP : SDN-C +-- ================================================================================ +-- Copyright (C) 2017 ONAP 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========================================================= +--- + +CREATE TABLE sdnctl.VNF ( +vnf_id varchar(80) NOT NULL, +vnf_name varchar(80) NOT NULL, +vnf_type varchar(10) NOT NULL, +orchestration_status varchar(20), +heat_stack_id varchar(80), +mso_catalog_key varchar(80), +availability_zone varchar(80), +aic_site_id varchar(80), +oam_ipv4_address varchar(20), +CONSTRAINT P_VNF PRIMARY KEY(vnf_id)); + +CREATE TABLE sdnctl.VNF_NETWORK_CONNECTION ( +connection_uuid varchar(80) NOT NULL, +vnf_id varchar(80) NOT NULL, +connection_id varchar(80), +connection_type varchar(20), +neutron_network_id varchar(80), +neutron_network_name varchar(80), +orchestration_status varchar(20), +switch_id varchar(40), +heat_stack_id varchar(80), +mso_catalog_key varchar(80), +provider_network varchar(80), +port_group_id varchar(80), +port_group_name varchar(80), +CONSTRAINT P_NETWORK_CONNECTION PRIMARY KEY(connection_uuid)); + +CREATE TABLE sdnctl.VNF_NETWORK_CONNECTION_VLAN ( +vlan_uuid varchar(80) NOT NULL, +vlan_id numeric(4) NOT NULL, +vlan_type varchar(5) NOT NULL, +connection_uuid varchar(80), +CONSTRAINT P_VNF_NETWORK_CONNECTION_VLAN PRIMARY KEY(vlan_uuid)); + +CREATE TABLE sdnctl.VLAN_ID_POOL ( +vlan_id numeric(4) NOT NULL, +universe varchar(40) NOT NULL, +status varchar(40) NOT NULL, +vlan_uuid varchar(80), +CONSTRAINT P_VLAN_ID_POOL PRIMARY KEY(vlan_id,universe)); + +CREATE TABLE sdnctl.IPV4_ADDRESS_POOL ( +ipv4_addr varchar(20) NOT NULL, +universe varchar(40) NOT NULL, +status varchar(40) NOT NULL, +CONSTRAINT P_IPV4_ADDRESS_POOL PRIMARY KEY(ipv4_addr, universe)); + + diff --git a/mdsal-resource/provider/src/main/resources/svclogic.properties b/mdsal-resource/provider/src/main/resources/svclogic.properties new file mode 100644 index 00000000..1a2cf0c7 --- /dev/null +++ b/mdsal-resource/provider/src/main/resources/svclogic.properties @@ -0,0 +1,26 @@ +### +# ============LICENSE_START======================================================= +# openECOMP : SDN-C +# ================================================================================ +# Copyright (C) 2017 ONAP 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========================================================= +### + +org.openecomp.sdnc.sli.dbtype = jdbc +org.openecomp.sdnc.sli.jdbc.url = jdbc:mysql://dbhost:3306/sdnctl +org.openecomp.sdnc.sli.jdbc.database = sdnctl +org.openecomp.sdnc.sli.jdbc.user = sdnctl +org.openecomp.sdnc.sli.jdbc.password = gamma diff --git a/pom.xml b/pom.xml new file mode 100755 index 00000000..141f3361 --- /dev/null +++ b/pom.xml @@ -0,0 +1,119 @@ + + + + + org.onap.ccsdk.parent + odlparent-boron-sr3 + 0.0.1-SNAPSHOT + + + 4.0.0 + pom + org.openecomp.sdnc.adaptors + sdnc-adaptors + + SDN-C Adaptors + https://wiki.openecomp.org + The SDN-C core components contains the SLI, dblib and root pom + + + + JIRA + https://jira.openecomp.org/ + + + + + scm:git:ssh://git@${openecomp.git.host}/sdnc-adaptors.git + scm:git:ssh://${openecomp.git.host}:${openecomp.git.port}/${openecomp.git.project}/sdnc-adaptors.git + ${openecomp.git.protocol}://${openecomp.git.host}/projects/${openecomp.git.project}/repos/sdnc-adaptors/browse + + + + Jenkins + https://jenkins.openecomp.org/ + + + + + sdnc-javadoc + dav:https://${openecomp.nexus.host}/content/sites/site/org/onap/sdnc/adaptors/${project.artifactId}/${project.version} + + + + + + blackduck + + + blackduck-scan + + + + + + com.blackducksoftware.integration + hub-maven-plugin + 1.4.0 + false + + ${project.name} + ${project.basedir} + + + + create-bdio-file + package + + createHubOutput + + + + + + + + + + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.17 + + true + + + + org.sonatype.plugins + nexus-staging-maven-plugin + 1.6.7 + true + + https://${openecomp.nexus.host} + ${openecomp.nexus.staging.profile-id} + ${openecomp.nexus.staging.server-id} + + + + + + + aai-service + mdsal-resource + resource-assignment + sql-resource + + + OpenECOMP + + 0.0.1-SNAPSHOT + + + diff --git a/resource-assignment/.gitignore b/resource-assignment/.gitignore new file mode 100755 index 00000000..b73caf31 --- /dev/null +++ b/resource-assignment/.gitignore @@ -0,0 +1,34 @@ +#####standard .git ignore entries##### + +## IDE Specific Files ## +org.eclipse.core.resources.prefs +.classpath +.project +.settings +.idea +.externalToolBuilders +maven-eclipse.xml +workspace + +## Compilation Files ## +*.class +**/target +target +target-ide +MANIFEST.MF + +## Misc Ignores (OS specific etc) ## +bin/ +dist +*~ +*.ipr +*.iml +*.iws +classes +out/ +.DS_STORE +.metadata + +## Folders which contain auto generated source code ## +yang-gen-config +yang-gen-sal diff --git a/resource-assignment/.sonar/checkstyle.xml b/resource-assignment/.sonar/checkstyle.xml new file mode 100755 index 00000000..3fa23153 --- /dev/null +++ b/resource-assignment/.sonar/checkstyle.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resource-assignment/.sonar/pmd.xml b/resource-assignment/.sonar/pmd.xml new file mode 100755 index 00000000..80343b3b --- /dev/null +++ b/resource-assignment/.sonar/pmd.xml @@ -0,0 +1,67 @@ + + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + + + 2 + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + + + 5 + + + 2 + + + 3 + + + 3 + + + diff --git a/resource-assignment/features/pom.xml b/resource-assignment/features/pom.xml new file mode 100755 index 00000000..73cea080 --- /dev/null +++ b/resource-assignment/features/pom.xml @@ -0,0 +1,133 @@ + + + 4.0.0 + + resource-assignment + org.openecomp.sdnc.adaptors + 0.0.1-SNAPSHOT + + resource-assignment-features + Resource Assignment Adaptor - Features + + jar + + + + + + org.openecomp.sdnc.adaptors + resource-assignment-provider + ${project.version} + + + + commons-lang + commons-lang + 2.6 + compile + + + + org.opendaylight.mdsal + features-mdsal + ${odl.mdsal.features.version} + features + xml + + runtime + + + + + + org.opendaylight.odlparent + opendaylight-karaf-empty + ${odl.karaf.empty.distro.version} + zip + + + + + org.opendaylight.odlparent + features-test + ${odl.commons.opendaylight.version} + test + + + + org.opendaylight.yangtools + features-yangtools + ${odl.yangtools.version} + features + xml + runtime + + + + + + + true + src/main/resources + + + + + org.apache.maven.plugins + maven-resources-plugin + + + filter + + resources + + generate-resources + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + attach-artifacts + + attach-artifact + + package + + + + ${project.build.directory}/classes/${features.file} + xml + features + + + + + + + + + diff --git a/resource-assignment/features/src/main/resources/features.xml b/resource-assignment/features/src/main/resources/features.xml new file mode 100644 index 00000000..01c55789 --- /dev/null +++ b/resource-assignment/features/src/main/resources/features.xml @@ -0,0 +1,40 @@ + + + + + + + mvn:org.opendaylight.mdsal/features-mdsal/${odl.mdsal.features.version}/xml/features + + + sdnc-sli + sdnc-dblib + spring + spring-jdbc + spring-dm + mvn:org.openecomp.sdnc.adaptors/resource-assignment-provider/${project.version} + mvn:mysql/mysql-connector-java/${mysql.connector.version} + + + diff --git a/resource-assignment/installer/pom.xml b/resource-assignment/installer/pom.xml new file mode 100755 index 00000000..81dcfbb2 --- /dev/null +++ b/resource-assignment/installer/pom.xml @@ -0,0 +1,138 @@ + + + 4.0.0 + + resource-assignment + org.openecomp.sdnc.adaptors + 0.0.1-SNAPSHOT + + resource-assignment-installer + Resource allocator- Karaf Installer + pom + + + sdnc-resource-assignment + sdnc-resource-assignment + mvn:org.openecomp.sdnc.adaptors/resource-assignment-features/${project.version}/xml/features + false + + + + + + org.openecomp.sdnc.adaptors + resource-assignment-features + ${project.version} + features + xml + + + * + * + + + + + + org.openecomp.sdnc.adaptors + resource-assignment-provider + ${project.version} + + + + + + + + maven-assembly-plugin + 2.6 + + + maven-repo-zip + + single + + package + + false + stage/${application.name}-${project.version} + + src/assembly/assemble_mvnrepo_zip.xml + + false + + + + installer-zip + + single + + package + + true + ${application.name}-${project.version}-installer + + src/assembly/assemble_installer_zip.xml + + false + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + + copy-dependencies + + prepare-package + + false + ${project.build.directory}/assembly/system + false + true + true + true + false + false + org.openecomp.sdnc + sli-common,sli-provider,dblib-provider + provided + + + + + + maven-resources-plugin + 2.6 + + + copy-version + + copy-resources + + validate + + ${basedir}/target/stage + + + src/main/resources/scripts + + install-feature.sh + + true + + + + + + + + + + + + diff --git a/resource-assignment/installer/src/assembly/assemble_installer_zip.xml b/resource-assignment/installer/src/assembly/assemble_installer_zip.xml new file mode 100644 index 00000000..e278872a --- /dev/null +++ b/resource-assignment/installer/src/assembly/assemble_installer_zip.xml @@ -0,0 +1,59 @@ + + + + + + installer_zip + + zip + + + + false + + + + target/stage/ + ${application.name} + 755 + + *.sh + + + + target/stage/ + ${application.name} + 644 + + *.sh + + + + + + + diff --git a/resource-assignment/installer/src/assembly/assemble_mvnrepo_zip.xml b/resource-assignment/installer/src/assembly/assemble_mvnrepo_zip.xml new file mode 100644 index 00000000..1edacdb6 --- /dev/null +++ b/resource-assignment/installer/src/assembly/assemble_mvnrepo_zip.xml @@ -0,0 +1,49 @@ + + + + + + mvnrepo_zip + + zip + + + + false + + + + target/assembly/ + . + + + + + + + + diff --git a/resource-assignment/installer/src/main/resources/scripts/install-feature.sh b/resource-assignment/installer/src/main/resources/scripts/install-feature.sh new file mode 100644 index 00000000..9a47d222 --- /dev/null +++ b/resource-assignment/installer/src/main/resources/scripts/install-feature.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +### +# ============LICENSE_START======================================================= +# openECOMP : SDN-C +# ================================================================================ +# Copyright (C) 2017 ONAP 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========================================================= +### + +ODL_HOME=${ODL_HOME:-/opt/opendaylight/current} +ODL_KARAF_CLIENT=${ODL_KARAF_CLIENT:-${ODL_HOME}/bin/client} +ODL_KARAF_CLIENT_OPTS=${ODL_KARAF_CLIENT_OPTS:-"-u karaf"} +INSTALLERDIR=$(dirname $0) + +REPOZIP=${INSTALLERDIR}/${features.boot}-${project.version}.zip + +if [ -f ${REPOZIP} ] +then + unzip -d ${ODL_HOME} ${REPOZIP} +else + echo "ERROR : repo zip ($REPOZIP) not found" + exit 1 +fi + +${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:repo-add ${features.repositories} +${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:install ${features.boot} diff --git a/resource-assignment/pom.xml b/resource-assignment/pom.xml new file mode 100755 index 00000000..a650d46f --- /dev/null +++ b/resource-assignment/pom.xml @@ -0,0 +1,43 @@ + + + + org.openecomp.sdnc.adaptors + sdnc-adaptors + 0.0.1-SNAPSHOT + + + 4.0.0 + pom + org.openecomp.sdnc.adaptors + resource-assignment + 0.0.1-SNAPSHOT + + + Resource Assignment Adaptor + The resource assignment adaptor allows service logic to check and allocate network capacity + + + + + org.openecomp.sdnc.adaptors + resource-assignment-features + features + xml + ${project.version} + + + + org.openecomp.sdnc.adaptors + resource-assignment-provider + ${project.version} + + + + + + provider + features + installer + + + diff --git a/resource-assignment/provider/pom.xml b/resource-assignment/provider/pom.xml new file mode 100755 index 00000000..9a17589c --- /dev/null +++ b/resource-assignment/provider/pom.xml @@ -0,0 +1,115 @@ + + + 4.0.0 + + org.openecomp.sdnc.adaptors + resource-assignment + 0.0.1-SNAPSHOT + + resource-assignment-provider + bundle + Resource Assignment Adaptor - Provider + http://maven.apache.org + + UTF-8 + + + + junit + junit + test + ${junit.version} + + + org.springframework + spring-test + ${spring.version} + test + + + com.h2database + h2 + ${h2database.version} + test + + + org.onap.ccsdk.sli.core + sli-common + ${sdnctl.sli.version} + compile + + + org.onap.ccsdk.sli.core + sli-provider + ${sdnctl.sli.version} + compile + + + org.onap.ccsdk.sli.core + dblib-provider + ${sdnctl.dblib.version} + runtime + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + jcl-over-slf4j + ${slf4j.version} + + + mysql + mysql-connector-java + ${mysql.connector.version} + jar + runtime + + + org.springframework + spring-beans + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-jdbc + ${spring.version} + + + + + + + + + + org.apache.felix + maven-bundle-plugin + ${bundle.plugin.version} + true + + + org.openecomp.sdnc.ra + org.openecomp.sdnc.ra + *,org.openecomp.sdnc.sli.resource.dblib,org.openecomp.sdnc.sli.*,org.osgi.framework.*,org.slf4j.*,com.mysql.jdbc.* + + true + + + + + + + + + + + + diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/comp/LockHelper.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/comp/LockHelper.java new file mode 100644 index 00000000..acdce65e --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/comp/LockHelper.java @@ -0,0 +1,35 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.lock.comp; + +import java.util.Collection; + +public interface LockHelper { + + void lock(String resourceName, String lockRequester, int lockTimeout /* Seconds */); + + void unlock(String resourceName, boolean force); + + void lock(Collection resourceNameList, String lockRequester, int lockTimeout /* Seconds */); + + void unlock(Collection resourceNameList, boolean force); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/comp/LockHelperImpl.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/comp/LockHelperImpl.java new file mode 100644 index 00000000..306fc162 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/comp/LockHelperImpl.java @@ -0,0 +1,166 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.lock.comp; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +import org.openecomp.sdnc.lock.dao.ResourceLockDao; +import org.openecomp.sdnc.lock.data.ResourceLock; + +public class LockHelperImpl implements LockHelper { + + private ResourceLockDao resourceLockDao; + private int retryCount = 10; + private int lockWait = 5; // Seconds + + @Override + public void lock(String resourceName, String lockRequester, int lockTimeout /* Seconds */) { + lock(Collections.singleton(resourceName), lockRequester, lockTimeout); + } + + @Override + public void unlock(String resourceName, boolean force) { + unlock(Collections.singleton(resourceName), force); + } + + @Override + public void lock(Collection resourceNameList, String lockRequester, int lockTimeout /* Seconds */) { + for (int i = 0; true; i++) { + try { + tryLock(resourceNameList, lockRequester, lockTimeout); + return; + } catch (ResourceLockedException e) { + if (i > retryCount) + throw e; + try { + Thread.sleep(lockWait * 1000); + } catch (InterruptedException ex) { + } + } + } + } + + @Override + public void unlock(Collection lockNames, boolean force) { + if (lockNames == null || lockNames.size() == 0) + return; + + resourceLockDao.lockTable(); + + try { + for (String name : lockNames) { + ResourceLock l = resourceLockDao.getByResourceName(name); + if (l != null) + if (force || l.lockCount == 1) + resourceLockDao.delete(l.id); + else + resourceLockDao.decrementLockCount(l.id); + } + } finally { + resourceLockDao.unlockTable(); + } + } + + public void tryLock(Collection resourceNameList, String lockRequester, int lockTimeout /* Seconds */) { + if (resourceNameList == null || resourceNameList.size() == 0) + return; + + lockRequester = generateLockRequester(lockRequester, 100); + + resourceLockDao.lockTable(); + + try { + // First check if all requested records are available to lock + + Date now = new Date(); + + List dbLockList = new ArrayList(); + List insertLockNameList = new ArrayList(); + for (String name : resourceNameList) { + ResourceLock l = resourceLockDao.getByResourceName(name); + + boolean canLock = + l == null || now.getTime() > l.expirationTime.getTime() || lockRequester != null && + lockRequester.equals(l.lockHolder) || l.lockCount <= 0; + if (!canLock) + throw new ResourceLockedException(l.resourceName, l.lockHolder, lockRequester); + + if (l != null) + dbLockList.add(l); + else + insertLockNameList.add(name); + } + + // Update the lock info in DB + for (ResourceLock l : dbLockList) + resourceLockDao.update(l.id, now, new Date(now.getTime() + lockTimeout * 1000), l.lockCount + 1); + + // Insert records for those that are not yet there + for (String lockName : insertLockNameList) { + ResourceLock l = new ResourceLock(); + l.resourceName = lockName; + l.lockHolder = lockRequester; + l.lockTime = now; + l.expirationTime = new Date(now.getTime() + lockTimeout * 1000); + l.lockCount = 1; + resourceLockDao.add(l); + } + } finally { + resourceLockDao.unlockTable(); + } + } + + private static String generateLockRequester(String name, int maxLength) { + if (name == null) + name = ""; + int l1 = name.length(); + String tname = Thread.currentThread().getName(); + int l2 = tname.length(); + if (l1 + l2 + 1 > maxLength) { + int maxl1 = maxLength / 2; + if (l1 > maxl1) { + name = name.substring(0, maxl1); + l1 = maxl1; + } + int maxl2 = maxLength - l1 - 1; + if (l2 > maxl2) + tname = tname.substring(0, 6) + "..." + tname.substring(l2 - maxl2 + 9); + } + return tname + '-' + name; + } + + public void setResourceLockDao(ResourceLockDao resourceLockDao) { + this.resourceLockDao = resourceLockDao; + } + + public void setRetryCount(int retryCount) { + this.retryCount = retryCount; + } + + public void setLockWait(int lockWait /* Seconds */) { + this.lockWait = lockWait; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/comp/ResourceLockedException.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/comp/ResourceLockedException.java new file mode 100644 index 00000000..8e3142cc --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/comp/ResourceLockedException.java @@ -0,0 +1,41 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.lock.comp; + +public class ResourceLockedException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + private String lockName, lockHolder, lockRequester; + + public ResourceLockedException(String lockName, String lockHolder, String lockRequester) { + this.lockName = lockName; + this.lockHolder = lockHolder; + this.lockRequester = lockRequester; + } + + @Override + public String getMessage() { + return "Failed to lock [" + lockName + "] for [" + lockRequester + "]. Currently locked by [" + lockHolder + + "]."; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/comp/SynchronizedFunction.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/comp/SynchronizedFunction.java new file mode 100644 index 00000000..a76fca11 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/comp/SynchronizedFunction.java @@ -0,0 +1,56 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.lock.comp; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +public abstract class SynchronizedFunction { + + private Set synchset; + private String lockRequester; + private int lockTimeout; // Seconds + private LockHelper lockHelper; + + protected SynchronizedFunction(LockHelper lockHelper, Collection synchset, int lockTimeout) { + this.lockHelper = lockHelper; + this.synchset = new HashSet(synchset); + this.lockRequester = generateLockRequester(); + this.lockTimeout = lockTimeout; + } + + protected abstract void _exec(); + + public void exec() { + lockHelper.lock(synchset, lockRequester, lockTimeout); + try { + _exec(); + } finally { + lockHelper.unlock(synchset, true); + } + } + + private static String generateLockRequester() { + return "SynchronizedFunction-" + (int) (Math.random() * 1000000); + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/dao/ResourceLockDao.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/dao/ResourceLockDao.java new file mode 100644 index 00000000..014765df --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/dao/ResourceLockDao.java @@ -0,0 +1,43 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.lock.dao; + +import java.util.Date; + +import org.openecomp.sdnc.lock.data.ResourceLock; + +public interface ResourceLockDao { + + void lockTable(); + + void unlockTable(); + + void add(ResourceLock l); + + void update(long id, Date lockTime, Date expirationTime, int lockCount); + + ResourceLock getByResourceName(String resourceName); + + void delete(long id); + + void decrementLockCount(long id); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/dao/ResourceLockDaoImpl.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/dao/ResourceLockDaoImpl.java new file mode 100644 index 00000000..f4819b83 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/dao/ResourceLockDaoImpl.java @@ -0,0 +1,115 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.lock.dao; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Date; +import java.util.List; + +import org.openecomp.sdnc.lock.data.ResourceLock; +import org.openecomp.sdnc.util.db.CachedDataSourceWrap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; + +public class ResourceLockDaoImpl implements ResourceLockDao { + + private static final Logger log = LoggerFactory.getLogger(ResourceLockDaoImpl.class); + + private JdbcTemplate jdbcTemplate; + private boolean testing = false; + + @Override + public void lockTable() { + if (!testing) { + jdbcTemplate.update("LOCK TABLES RESOURCE_LOCK WRITE"); + log.info("Table RESOURCE_LOCK locked."); + } + } + + @Override + public void unlockTable() { + if (!testing) { + jdbcTemplate.update("UNLOCK TABLES"); + log.info("Table RESOURCE_LOCK unlocked."); + + CachedDataSourceWrap ds = (CachedDataSourceWrap) jdbcTemplate.getDataSource(); + ds.releaseConnection(); + } + } + + @Override + public void add(ResourceLock l) { + jdbcTemplate.update( + "INSERT INTO RESOURCE_LOCK (resource_name, lock_holder, lock_count, lock_time, expiration_time)\n" + + "VALUES (?, ?, ?, ?, ?)", + new Object[] { l.resourceName, l.lockHolder, l.lockCount, l.lockTime, l.expirationTime }); + } + + @Override + public void update(long id, Date lockTime, Date expirationTime, int lockCount) { + jdbcTemplate.update( + "UPDATE RESOURCE_LOCK SET lock_time = ?, expiration_time = ?, lock_count = ? WHERE resource_lock_id = ?", + new Object[] { lockTime, expirationTime, lockCount, id }); + } + + @Override + public ResourceLock getByResourceName(String resourceName) { + List ll = jdbcTemplate.query("SELECT * FROM RESOURCE_LOCK WHERE resource_name = ?", + new Object[] { resourceName }, new RowMapper() { + + @Override + public ResourceLock mapRow(ResultSet rs, int rowNum) throws SQLException { + ResourceLock rl = new ResourceLock(); + rl.id = rs.getLong("resource_lock_id"); + rl.resourceName = rs.getString("resource_name"); + rl.lockHolder = rs.getString("lock_holder"); + rl.lockCount = rs.getInt("lock_count"); + rl.lockTime = rs.getTimestamp("lock_time"); + rl.expirationTime = rs.getTimestamp("expiration_time"); + return rl; + } + }); + return ll != null && !ll.isEmpty() ? ll.get(0) : null; + } + + @Override + public void delete(long id) { + jdbcTemplate.update("DELETE FROM RESOURCE_LOCK WHERE resource_lock_id = ?", new Object[] { id }); + } + + @Override + public void decrementLockCount(long id) { + jdbcTemplate.update("UPDATE RESOURCE_LOCK SET lock_count = lock_count - 1 WHERE resource_lock_id = ?", + new Object[] { id }); + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public void setTesting(boolean testing) { + this.testing = testing; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/data/ResourceLock.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/data/ResourceLock.java new file mode 100644 index 00000000..561fd82a --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/data/ResourceLock.java @@ -0,0 +1,34 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.lock.data; + +import java.util.Date; + +public class ResourceLock { + + public long id; + public String resourceName; + public String lockHolder; + public int lockCount; + public Date lockTime; + public Date expirationTime; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/ReleaseRequestType.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/ReleaseRequestType.java new file mode 100644 index 00000000..52104ec5 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/ReleaseRequestType.java @@ -0,0 +1,45 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra; + +public enum ReleaseRequestType { + Cancel, Activate, Disconnect; + + public static ReleaseRequestType convert(Object o) { + if (o == null) + return null; + String s = o.toString(); + s = s.trim(); + if (s.length() == 0) + return null; + + if (s.equalsIgnoreCase("Cancel")) + return Cancel; + if (s.equalsIgnoreCase("Activate")) + return Activate; + if (s.equalsIgnoreCase("Disconnect")) + return Disconnect; + + throw new IllegalArgumentException("Invalid request-type: " + s + + ". Supported values are Cancel, Activate, Disconnect."); + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/ReserveRequestType.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/ReserveRequestType.java new file mode 100644 index 00000000..d9964331 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/ReserveRequestType.java @@ -0,0 +1,43 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra; + +public enum ReserveRequestType { + New, Change; + + public static ReserveRequestType convert(Object o) { + if (o == null) + return null; + String s = o.toString(); + s = s.trim(); + if (s.length() == 0) + return null; + + if (s.equalsIgnoreCase("New")) + return New; + if (s.equalsIgnoreCase("Change")) + return Change; + + throw new IllegalArgumentException("Invalid request-type: " + s + + ". Supported values are New, Change."); + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/ResourceAllocator.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/ResourceAllocator.java new file mode 100644 index 00000000..ae281cf1 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/ResourceAllocator.java @@ -0,0 +1,1016 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource.QueryStatus; +import org.openecomp.sdnc.ra.comp.EndPointAllocator; +import org.openecomp.sdnc.ra.comp.EndPointData; +import org.openecomp.sdnc.ra.comp.ServiceData; +import org.openecomp.sdnc.ra.equip.dao.ServerDao; +import org.openecomp.sdnc.ra.equip.dao.VpePortDao; +import org.openecomp.sdnc.ra.equip.dao.VplspePortDao; +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.openecomp.sdnc.ra.equip.data.EquipmentLevel; +import org.openecomp.sdnc.ra.rule.comp.AllocationRequestBuilder; +import org.openecomp.sdnc.ra.rule.dao.MaxPortSpeedDao; +import org.openecomp.sdnc.ra.rule.dao.MaxServerSpeedDao; +import org.openecomp.sdnc.ra.rule.dao.ParameterDao; +import org.openecomp.sdnc.ra.rule.data.ThresholdStatus; +import org.openecomp.sdnc.ra.service.dao.ServiceResourceDao; +import org.openecomp.sdnc.ra.service.data.ServiceResource; +import org.openecomp.sdnc.ra.service.data.ServiceStatus; +import org.openecomp.sdnc.rm.comp.ResourceManager; +import org.openecomp.sdnc.rm.data.AllocationAction; +import org.openecomp.sdnc.rm.data.AllocationItem; +import org.openecomp.sdnc.rm.data.AllocationOutcome; +import org.openecomp.sdnc.rm.data.AllocationRequest; +import org.openecomp.sdnc.rm.data.AllocationStatus; +import org.openecomp.sdnc.rm.data.LimitAllocationOutcome; +import org.openecomp.sdnc.rm.data.LimitAllocationRequest; +import org.openecomp.sdnc.rm.data.LimitResource; +import org.openecomp.sdnc.rm.data.MultiResourceAllocationOutcome; +import org.openecomp.sdnc.rm.data.RangeAllocationItem; +import org.openecomp.sdnc.rm.data.RangeResource; +import org.openecomp.sdnc.rm.data.Resource; +import org.openecomp.sdnc.util.speed.SpeedUtil; +import org.openecomp.sdnc.util.str.StrUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ResourceAllocator implements SvcLogicResource { + + private static final Logger log = LoggerFactory.getLogger(ResourceAllocator.class); + + public ResourceAllocator() { + log.info("ResourceAllocator created."); + } + + private ServerDao serverDao; + private VpePortDao vpePortDao; + private VplspePortDao vplspePortDao; + private MaxPortSpeedDao maxPortSpeedDao; + private MaxServerSpeedDao maxServerSpeedDao; + private ServiceResourceDao serviceResourceDao; + private ParameterDao parameterDao; + + private AllocationRequestBuilder allocationRequestBuilder; + private ResourceManager resourceManager; + private SpeedUtil speedUtil; + + private EndPointAllocator endPointAllocator; + + @Override + public QueryStatus notify(String resource, String action, String key, SvcLogicContext ctx) + throws SvcLogicException { + return (QueryStatus.SUCCESS); + } + + @Override + public QueryStatus update( + String resource, + String key, + Map parms, + String prefix, + SvcLogicContext ctx) throws SvcLogicException { + + return QueryStatus.SUCCESS; + } + + @Override + public QueryStatus exists(String resource, String key, String prefix, SvcLogicContext ctx) + throws SvcLogicException { + return QueryStatus.SUCCESS; + } + + @Override + public QueryStatus delete(String arg0, String arg1, SvcLogicContext arg2) throws SvcLogicException { + return QueryStatus.SUCCESS; + } + + @Override + public QueryStatus save( + String arg0, + boolean arg1, + boolean arg2, + String arg3, + Map arg4, + String arg5, + SvcLogicContext arg6) throws SvcLogicException { + return QueryStatus.SUCCESS; + } + + @Override + public QueryStatus isAvailable(String resource, String key, String prefix, SvcLogicContext ctx) + throws SvcLogicException { + String serviceModel = ctx.getAttribute("tmp.resource-allocator.service-model"); + if (serviceModel != null && serviceModel.trim().length() > 0) + return allocateResources(serviceModel, ctx, true, prefix); + return allocateResourcesL3SDN(ctx, true, prefix); + } + + @Override + public QueryStatus query( + String resource, + boolean localOnly, + String select, + String key, + String prefix, + String orderBy, + SvcLogicContext ctx) throws SvcLogicException { + + prefix = prefix == null ? "" : prefix + '.'; + + if (!resource.equals("NetworkCapacity")) { + log.info("resource: " + resource); + log.info("key: " + key); + + Resource r = resourceManager.getResource(resource, key); + if (r == null) + return QueryStatus.NOT_FOUND; + + if (r instanceof LimitResource) { + ctx.setAttribute(prefix + "used", String.valueOf(((LimitResource) r).used)); + + log.info("Added context attr: " + prefix + "used: " + String.valueOf(((LimitResource) r).used)); + } + + return QueryStatus.SUCCESS; + } + + log.info("key: " + key); + log.info("prefix: " + prefix); + + if (key == null) + return QueryStatus.SUCCESS; + + if (key.startsWith("'") && key.endsWith("'")) + key = key.substring(1, key.length() - 1); + + String endPointPosition = "VPE-Cust"; + + String resourceUnionId = key + '/' + endPointPosition; + List rlist = resourceManager.getResourceUnion(resourceUnionId); + + log.info("Resources found for " + resourceUnionId + ": " + rlist.size()); + + String assetId = null; + for (Resource r : rlist) { + log.info("Resource: " + r.resourceKey.resourceName); + + if (r instanceof RangeResource) { + RangeResource rr = (RangeResource) r; + for (AllocationItem ai : r.allocationItems) + if (ai.resourceUnionId.equals(resourceUnionId)) { + RangeAllocationItem rai = (RangeAllocationItem) ai; + ctx.setAttribute(prefix + r.resourceKey.resourceName, String.valueOf(rai.used.first())); + + log.info("Added context attr: " + prefix + r.resourceKey.resourceName + ": " + + String.valueOf(rr.used.first())); + + assetId = r.resourceKey.assetId; + String vpeName = assetId; + int i1 = assetId.indexOf('/'); + if (i1 > 0) + vpeName = assetId.substring(0, i1); + ctx.setAttribute(prefix + "vpe-name", vpeName); + + log.info("Added context attr: " + prefix + "vpe-name: " + vpeName); + } + } + } + + String affinityLink = "1"; + if (assetId != null) { + for (Resource r : rlist) { + if (r instanceof LimitResource) { + LimitResource ll = (LimitResource) r; + if (ll.resourceKey.assetId.startsWith(assetId + '-')) { + int i1 = ll.resourceKey.assetId.lastIndexOf('-'); + affinityLink = ll.resourceKey.assetId.substring(i1 + 1); + break; + } + } + } + } + + ctx.setAttribute(prefix + "affinity-link", affinityLink); + + log.info("Added context attr: " + prefix + "affinity-link: " + affinityLink); + + return QueryStatus.SUCCESS; + } + + @Override + public QueryStatus reserve(String resource, String select, String key, String prefix, SvcLogicContext ctx) + throws SvcLogicException { + String serviceModel = ctx.getAttribute("tmp.resource-allocator.service-model"); + if (serviceModel != null && serviceModel.trim().length() > 0) + return allocateResources(serviceModel, ctx, false, prefix); + return allocateResourcesL3SDN(ctx, false, prefix); + } + + @Override + public QueryStatus release(String resource, String key, SvcLogicContext ctx) throws SvcLogicException { + String serviceInstanceId = ctx.getAttribute("tmp.resource-allocator.service-instance-id"); + if (serviceInstanceId == null) + throw new SvcLogicException("tmp.resource-allocator.service-instance-id is required in ResourceAllocator"); + + String requestTypeStr = ctx.getAttribute("tmp.resource-allocator.request-type"); + if (requestTypeStr == null) + throw new SvcLogicException("tmp.resource-allocator.request-type is required in ResourceAllocator"); + + ReleaseRequestType requestType = null; + try { + requestType = ReleaseRequestType.convert(requestTypeStr); + } catch (IllegalArgumentException e) { + throw new SvcLogicException("Invalid tmp.resource-allocator.request-type: " + requestTypeStr + + ". Supported values are Cancel, Activate, Disconnect."); + } + + log.info("Starting release: " + requestType + " for: " + serviceInstanceId); + + ServiceResource activeServiceResource = + serviceResourceDao.getServiceResource(serviceInstanceId, ServiceStatus.Active); + ServiceResource pendingServiceResource = + serviceResourceDao.getServiceResource(serviceInstanceId, ServiceStatus.Pending); + + log.info("Active ServiceResource: "); + StrUtil.info(log, activeServiceResource); + log.info("Pending ServiceResource: "); + StrUtil.info(log, pendingServiceResource); + + if (requestType == ReleaseRequestType.Cancel) { + if (pendingServiceResource != null) { + log.info("Releasing pending resources: " + pendingServiceResource.resourceSetId); + + resourceManager.releaseResourceSet(pendingServiceResource.resourceSetId); + serviceResourceDao.deleteServiceResource(serviceInstanceId, ServiceStatus.Pending); + } else { + log.info("Pending record not found for service instance: " + serviceInstanceId + ". Nothing to do."); + } + + } else if (requestType == ReleaseRequestType.Activate) { + if (pendingServiceResource != null) { + if (activeServiceResource != null) { + log.info("Releasing active resources: " + activeServiceResource.resourceSetId); + + resourceManager.releaseResourceSet(activeServiceResource.resourceSetId); + serviceResourceDao.deleteServiceResource(serviceInstanceId, ServiceStatus.Active); + } + + log.info("Updating the status of the pending record to active."); + + serviceResourceDao.updateServiceStatus(serviceInstanceId, ServiceStatus.Pending, ServiceStatus.Active); + } else { + log.info("Pending record not found for service instance: " + serviceInstanceId + ". Nothing to do."); + } + + } else if (requestType == ReleaseRequestType.Disconnect) { + if (pendingServiceResource != null) { + log.info("Releasing pending resources: " + pendingServiceResource.resourceSetId); + + resourceManager.releaseResourceSet(pendingServiceResource.resourceSetId); + serviceResourceDao.deleteServiceResource(serviceInstanceId, ServiceStatus.Pending); + } + if (activeServiceResource != null) { + log.info("Releasing active resources: " + activeServiceResource.resourceSetId); + + resourceManager.releaseResourceSet(activeServiceResource.resourceSetId); + serviceResourceDao.deleteServiceResource(serviceInstanceId, ServiceStatus.Active); + } + } + + return QueryStatus.SUCCESS; + } + + private QueryStatus allocateResourcesL3SDN(SvcLogicContext ctx, boolean checkOnly, String prefix) + throws SvcLogicException { + prefix = prefix == null ? "" : prefix + '.'; + + String aicSiteId = getAicSiteId(ctx); + Map service = getServiceData(ctx); + + String requestTypeStr = ctx.getAttribute("tmp.resource-allocator.request-type"); + if (requestTypeStr == null) + requestTypeStr = "New"; + + ReserveRequestType requestType = null; + try { + requestType = ReserveRequestType.convert(requestTypeStr); + } catch (IllegalArgumentException e) { + throw new SvcLogicException("Invalid tmp.resource-allocator.request-type: " + requestTypeStr + + ". Supported values are New, Change."); + } + + String serviceInstanceId = String.valueOf(service.get("service-instance-id")); + + ServiceResource activeServiceResource = + serviceResourceDao.getServiceResource(serviceInstanceId, ServiceStatus.Active); + ServiceResource pendingServiceResource = + serviceResourceDao.getServiceResource(serviceInstanceId, ServiceStatus.Pending); + + log.info("Active ServiceResource: "); + StrUtil.info(log, activeServiceResource); + log.info("Pending ServiceResource: "); + StrUtil.info(log, pendingServiceResource); + + ServiceResource sr = new ServiceResource(); + sr.serviceInstanceId = serviceInstanceId; + sr.serviceStatus = ServiceStatus.Pending; + sr.serviceChangeNumber = 1; + if (pendingServiceResource != null) + sr.serviceChangeNumber = pendingServiceResource.serviceChangeNumber + 1; + else if (activeServiceResource != null) + sr.serviceChangeNumber = activeServiceResource.serviceChangeNumber + 1; + sr.resourceSetId = serviceInstanceId + "/" + sr.serviceChangeNumber; + sr.resourceUnionId = serviceInstanceId; + + log.info("New ServiceResource: "); + StrUtil.info(log, sr); + + List> vpePortData = vpePortDao.getVpePortData(aicSiteId); + List> vplspePortData = vplspePortDao.getVplspePortData(aicSiteId); + List> serverData = serverDao.getServerData(aicSiteId); + + vpePortData = orderVpe(vpePortData); + + long maxAvailableSpeedVpePort = 0; + boolean vpePortFound = false; + + for (Map vpe : vpePortData) { + String vpeId = String.valueOf(vpe.get("vpe-id")); + String interfaceName = String.valueOf(vpe.get("physical-interface-name")); + String portId = vpeId + "/" + interfaceName; + + log.info("Checking VPE port: " + portId); + + String provStatus = String.valueOf(vpe.get("provisioning-status")); + if (!provStatus.equals("PROV")) { + log.info("Skipping port " + portId + ": Provisioning status is not PROV."); + continue; + } + + String imageFile = String.valueOf(vpe.get("image-file-name")); + String endPointPosition = "VPE-Cust"; + long maxPortSpeed = maxPortSpeedDao.getMaxPortSpeed(imageFile, endPointPosition, interfaceName); + vpe.put("max-port-speed", maxPortSpeed); + + EquipmentData ed = new EquipmentData(); + ed.data = vpe; + ed.equipmentId = portId; + ed.equipmentLevel = EquipmentLevel.Port; + + ServiceData sd = new ServiceData(); + sd.data = service; + sd.serviceModel = "L3SDN"; + sd.endPointPosition = endPointPosition; + sd.resourceUnionId = sr.resourceUnionId; + sd.resourceSetId = sr.resourceSetId; + + StrUtil.info(log, ed); + StrUtil.info(log, sd); + + AllocationRequest ar = allocationRequestBuilder.buildAllocationRequest(sd, ed, checkOnly, + requestType == ReserveRequestType.Change); + AllocationOutcome ao = resourceManager.allocateResources(ar); + + if (ao.status == AllocationStatus.Success) { + + // Assign affinity link + if (!checkOnly) { + List affinityLinkIdList = new ArrayList<>(); + affinityLinkIdList.add("0"); + affinityLinkIdList.add("1"); + affinityLinkIdList.add("2"); + affinityLinkIdList.add("3"); + + String preferedAffinityLinkId = "0"; + long lowestAssignedBw = Long.MAX_VALUE; + for (String affinityLinkId : affinityLinkIdList) { + long used = 0; + String assetId = ed.equipmentId + "-" + affinityLinkId; + Resource r = resourceManager.getResource("Bandwidth", assetId); + if (r != null) { + LimitResource ll = (LimitResource) r; + used = ll.used; + } + if (used < lowestAssignedBw) { + lowestAssignedBw = used; + preferedAffinityLinkId = affinityLinkId; + } + log.info("Assigned bandwidth on affinity link: " + assetId + ": " + used); + } + + log.info("Prefered affinity link for " + ed.equipmentId + ": " + preferedAffinityLinkId); + + ctx.setAttribute(prefix + "affinity-link", preferedAffinityLinkId); + + LimitAllocationRequest ar1 = new LimitAllocationRequest(); + ar1.resourceSetId = sd.resourceSetId; + ar1.resourceUnionId = sd.resourceUnionId; + ar1.resourceShareGroupList = null; + ar1.resourceName = "Bandwidth"; + ar1.assetId = ed.equipmentId + "-" + preferedAffinityLinkId; + ar1.missingResourceAction = AllocationAction.Succeed_Allocate; + ar1.expiredResourceAction = AllocationAction.Succeed_Allocate; + ar1.replace = true; + ar1.strict = false; + ar1.checkLimit = Long.MAX_VALUE; + ar1.checkCount = 0; + ar1.allocateCount = (Long) sd.data.get("service-speed-kbps"); + + resourceManager.allocateResources(ar1); + } + + ctx.setAttribute(prefix + "vpe-name", vpeId); + + vpePortFound = true; + break; + } + + if (ao instanceof LimitAllocationOutcome) { + LimitAllocationOutcome lao = (LimitAllocationOutcome) ao; + long available = lao.limit - lao.used; + if (available > maxAvailableSpeedVpePort) + maxAvailableSpeedVpePort = available; + } + } + + long maxAvailableSpeedVplspePort = 0; + boolean vplspePortFound = false; + + for (Map vplspe : vplspePortData) { + String vplspeId = String.valueOf(vplspe.get("vplspe-id")); + String interfaceName = String.valueOf(vplspe.get("physical-interface-name")); + String portId = vplspeId + "/" + interfaceName; + + log.info("Checking VPLSPE port: " + portId); + + String provStatus = String.valueOf(vplspe.get("provisioning-status")); + if (!provStatus.equals("PROV")) { + log.info("Skipping port " + portId + ": Provisioning status is not PROV."); + continue; + } + + long physicalSpeed = (Long) vplspe.get("physical-interface-speed"); + String physicalSpeedUnit = String.valueOf(vplspe.get("physical-interface-speed-unit")); + long maxPortSpeed = speedUtil.convertToKbps(physicalSpeed, physicalSpeedUnit); + vplspe.put("max-port-speed", maxPortSpeed); + + EquipmentData ed = new EquipmentData(); + ed.data = vplspe; + ed.equipmentId = portId; + ed.equipmentLevel = EquipmentLevel.Port; + + ServiceData sd = new ServiceData(); + sd.data = service; + sd.serviceModel = "L3SDN"; + sd.endPointPosition = "IPAG-TOA"; + sd.resourceUnionId = sr.resourceUnionId; + sd.resourceSetId = sr.resourceSetId; + + StrUtil.info(log, ed); + StrUtil.info(log, sd); + + AllocationRequest ar = allocationRequestBuilder.buildAllocationRequest(sd, ed, checkOnly, + requestType == ReserveRequestType.Change); + AllocationOutcome ao = resourceManager.allocateResources(ar); + + if (ao.status == AllocationStatus.Success) { + vplspePortFound = true; + break; + } + + if (ao instanceof LimitAllocationOutcome) { + LimitAllocationOutcome lao = (LimitAllocationOutcome) ao; + long available = lao.limit - lao.used; + if (available > maxAvailableSpeedVplspePort) + maxAvailableSpeedVplspePort = available; + } + } + + long maxAvailableSpeedServer = 0; + boolean serverFound = false; + + for (Map server : serverData) { + String serverId = String.valueOf(server.get("server-id")); + String serverModel = String.valueOf(server.get("server-model")); + + log.info("Checking Server: " + serverId); + + String endPointPosition = "VCE-Cust"; + + int serverCount = (Integer) server.get("server-count"); + if (serverCount == 0) + serverCount = 1; + String ratioString = parameterDao.getParameter("homing.pserver.sparing.ratio"); + if (ratioString == null || ratioString.length() == 0) + ratioString = "1:1"; + int primaryServerCount = calculatePrimaryServerCount(serverCount, ratioString); + server.put("number-primary-servers", primaryServerCount); + + int evcCount = getEvcCountOnServer(serverId); + int evcCountPerServer = (evcCount + primaryServerCount - 1) / primaryServerCount; + long maxServerSpeed = maxServerSpeedDao.getMaxServerSpeed(serverModel, evcCountPerServer); + server.put("max-server-speed", maxServerSpeed); + server.put("evc-count", evcCount); + server.put("evc-count-per-server", evcCountPerServer); + + EquipmentData ed = new EquipmentData(); + ed.data = server; + ed.equipmentId = serverId; + ed.equipmentLevel = EquipmentLevel.Server; + + ServiceData sd = new ServiceData(); + sd.data = service; + sd.serviceModel = "L3SDN"; + sd.endPointPosition = endPointPosition; + sd.resourceUnionId = sr.resourceUnionId; + sd.resourceSetId = sr.resourceSetId; + + StrUtil.info(log, ed); + StrUtil.info(log, sd); + + AllocationRequest ar = allocationRequestBuilder.buildAllocationRequest(sd, ed, checkOnly, + requestType == ReserveRequestType.Change); + AllocationOutcome ao = resourceManager.allocateResources(ar); + + if (ao.status == AllocationStatus.Success) { + serverFound = true; + + if (ao instanceof MultiResourceAllocationOutcome) { + MultiResourceAllocationOutcome mrao = (MultiResourceAllocationOutcome) ao; + for (AllocationOutcome ao1 : mrao.allocationOutcomeList) { + if (ao1 instanceof LimitAllocationOutcome) { + LimitAllocationOutcome lao = (LimitAllocationOutcome) ao1; + if (lao.request.resourceName.equals("Bandwidth")) { + ThresholdStatus th = allocationRequestBuilder.getThresholdStatus(sd, ed, lao); + setThresholdData(ctx, th, sd, ed); + } + } + } + } + + break; + } + + if (ao instanceof MultiResourceAllocationOutcome) { + MultiResourceAllocationOutcome mrao = (MultiResourceAllocationOutcome) ao; + for (AllocationOutcome ao1 : mrao.allocationOutcomeList) { + if (ao1 instanceof LimitAllocationOutcome) { + LimitAllocationOutcome lao = (LimitAllocationOutcome) ao1; + if (lao.status == AllocationStatus.Failure && lao.request.resourceName.equals("Bandwidth")) { + long available = lao.limit - lao.used; + if (available > maxAvailableSpeedServer) + maxAvailableSpeedServer = available; + } + if (lao.status == AllocationStatus.Failure && lao.request.resourceName.equals("Connection")) { + maxAvailableSpeedServer = 0; + break; + } + + ThresholdStatus th = allocationRequestBuilder.getThresholdStatus(sd, ed, lao); + setThresholdData(ctx, th, sd, ed); + } + } + } + } + + if (vpePortFound && vplspePortFound && serverFound) { + if (!checkOnly) { + if (pendingServiceResource == null) { + log.info("Adding the pending service resource record to DB."); + serviceResourceDao.addServiceResource(sr); + } else { + log.info("Releasing previously allocated resources for resource set id: " + + pendingServiceResource.resourceSetId); + resourceManager.releaseResourceSet(pendingServiceResource.resourceSetId); + + log.info("Updating the pending service resource record in DB with service change number: " + + sr.serviceChangeNumber); + serviceResourceDao.updateServiceResource(sr); + } + } + + return QueryStatus.SUCCESS; + } + + log.info("Releasing allocated resources (if any) for resource set id: " + sr.resourceSetId); + resourceManager.releaseResourceSet(sr.resourceSetId); + + long maxAvailableSpeed = Long.MAX_VALUE; + if (!vpePortFound && maxAvailableSpeedVpePort < maxAvailableSpeed) + maxAvailableSpeed = maxAvailableSpeedVpePort; + if (!vplspePortFound && maxAvailableSpeedVplspePort < maxAvailableSpeed) + maxAvailableSpeed = maxAvailableSpeedVplspePort; + if (!serverFound && maxAvailableSpeedServer < maxAvailableSpeed) + maxAvailableSpeed = maxAvailableSpeedServer; + + setOutputContext(ctx, maxAvailableSpeed, "kbps"); + return QueryStatus.NOT_FOUND; + } + + private List> orderVpe(List> vpePortData) { + for (Map vpe : vpePortData) { + String vpeId = String.valueOf(vpe.get("vpe-id")); + String interfaceName = String.valueOf(vpe.get("physical-interface-name")); + String portId = vpeId + "/" + interfaceName; + Resource r = resourceManager.getResource("Bandwidth", portId); + long used = 0; + if (r != null) { + LimitResource ll = (LimitResource) r; + used = ll.used; + } + vpe.put("used-bandwidth", used); + + log.info("Used bandwidth on VPE: " + vpeId + ": " + used); + } + + Collections.sort(vpePortData, new Comparator>() { + + @Override + public int compare(Map o1, Map o2) { + long used1 = (Long) o1.get("used-bandwidth"); + long used2 = (Long) o2.get("used-bandwidth"); + if (used1 < used2) + return -1; + if (used1 > used2) + return 1; + return 0; + } + }); + + return vpePortData; + } + + private void setThresholdData(SvcLogicContext ctx, ThresholdStatus th, ServiceData sd, EquipmentData ed) { + if (th == null) + return; + + String pp = "tmp.resource-allocator-output.threshold-notification-list.threshold-hotification[0]."; + ctx.setAttribute("tmp.resource-allocator-output.threshold-notification-list.threshold-hotification_length", + "1"); + ctx.setAttribute(pp + "message", th.resourceThreshold.message); + ctx.setAttribute(pp + "resource-rule.service-model", th.resourceRule.serviceModel); + ctx.setAttribute(pp + "resource-rule.endpoint-position", th.resourceRule.endPointPosition); + ctx.setAttribute(pp + "resource-rule.resource-name", th.resourceRule.resourceName); + ctx.setAttribute(pp + "resource-rule.equipment-level", th.resourceRule.equipmentLevel); + ctx.setAttribute(pp + "resource-rule.soft-limit-expression", th.resourceRule.softLimitExpression); + ctx.setAttribute(pp + "resource-rule.hard-limit-expression", th.resourceRule.hardLimitExpression); + ctx.setAttribute(pp + "resource-state.used", String.valueOf(th.used)); + ctx.setAttribute(pp + "resource-state.limit-value", String.valueOf(th.limitValue)); + ctx.setAttribute(pp + "resource-state.threshold-value", String.valueOf(th.thresholdValue)); + ctx.setAttribute(pp + "resource-state.last-added", String.valueOf(th.lastAdded)); + ctx.setAttribute(pp + "equipment-data.equipment-id", ed.equipmentId); + for (String edKey : ed.data.keySet()) + ctx.setAttribute(pp + "equipment-data." + edKey, String.valueOf(ed.data.get(edKey))); + } + + private QueryStatus allocateResources(String serviceModel, SvcLogicContext ctx, boolean checkOnly, String prefix) + throws SvcLogicException { + prefix = prefix == null ? "" : prefix + '.'; + + Map service = getServiceData(ctx); + Map ec = getEquipConstraints(ctx); + + String requestTypeStr = ctx.getAttribute("tmp.resource-allocator.request-type"); + if (requestTypeStr == null) + requestTypeStr = "New"; + + ReserveRequestType requestType = null; + try { + requestType = ReserveRequestType.convert(requestTypeStr); + } catch (IllegalArgumentException e) { + throw new SvcLogicException("Invalid tmp.resource-allocator.request-type: " + requestTypeStr + + ". Supported values are New, Change."); + } + + String serviceInstanceId = String.valueOf(service.get("service-instance-id")); + + log.info("Starting reserve: " + requestType + ", service-instance-id: " + serviceInstanceId); + + ServiceResource activeServiceResource = + serviceResourceDao.getServiceResource(serviceInstanceId, ServiceStatus.Active); + ServiceResource pendingServiceResource = + serviceResourceDao.getServiceResource(serviceInstanceId, ServiceStatus.Pending); + + log.info("Active ServiceResource: "); + StrUtil.info(log, activeServiceResource); + log.info("Pending ServiceResource: "); + StrUtil.info(log, pendingServiceResource); + + int changeNumber = 1; + if (pendingServiceResource != null) + changeNumber = pendingServiceResource.serviceChangeNumber + 1; + else if (activeServiceResource != null) + changeNumber = activeServiceResource.serviceChangeNumber + 1; + + ServiceData sd = new ServiceData(); + sd.data = service; + sd.serviceModel = serviceModel; + sd.endPointPosition = (String) service.get("end-point-position"); + sd.resourceShareGroup = (String) service.get("resource-share-group"); + sd.resourceName = (String) service.get("resource-name"); + sd.serviceInstanceId = serviceInstanceId; + + StrUtil.info(log, sd); + + List epList = endPointAllocator.allocateEndPoints(sd, ec, checkOnly, + requestType == ReserveRequestType.Change, changeNumber); + + if (epList != null && !epList.isEmpty()) { + if (!checkOnly) { + EndPointData ep = epList.get(0); + + if (sd.resourceName == null) { + ServiceResource sr = new ServiceResource(); + sr.serviceInstanceId = serviceInstanceId; + sr.serviceStatus = ServiceStatus.Pending; + sr.serviceChangeNumber = changeNumber; + sr.resourceSetId = ep.resourceSetId; + sr.resourceUnionId = ep.resourceUnionId; + + log.info("New ServiceResource: "); + StrUtil.info(log, sr); + + if (pendingServiceResource == null) { + log.info("Adding the pending service resource record to DB."); + serviceResourceDao.addServiceResource(sr); + } else { + log.info("Releasing previously allocated resources for resource set id: " + + pendingServiceResource.resourceSetId); + resourceManager.releaseResourceSet(pendingServiceResource.resourceSetId); + + log.info("Updating the pending service resource record in DB with service change number: " + + sr.serviceChangeNumber); + serviceResourceDao.updateServiceResource(sr); + } + } + + for (EndPointData ep1 : epList) + if (ep1.data != null && !ep1.data.isEmpty()) + for (String key : ep1.data.keySet()) { + String value = String.valueOf(ep1.data.get(key)); + ctx.setAttribute(prefix + key, value); + + log.info("Added context attr: " + prefix + key + ": " + value); + } + } + + return QueryStatus.SUCCESS; + } + + log.info("Capacity not found for EVC: " + serviceInstanceId); + + return QueryStatus.NOT_FOUND; + } + + private int getEvcCountOnServer(String serverId) { + LimitResource l = (LimitResource) resourceManager.getResource("Connection", serverId); + if (l != null) + return (int) l.used; + return 0; + } + + private String getAicSiteId(SvcLogicContext ctx) throws SvcLogicException { + String aicSiteId = ctx.getAttribute("tmp.resource-allocator.aic-site-id"); + if (aicSiteId == null) + throw new SvcLogicException("tmp.resource-allocator.aic-site-id is required in ResourceAllocator"); + return aicSiteId; + } + + private Map getServiceData(SvcLogicContext ctx) throws SvcLogicException { + Map sd = new HashMap(); + + String endPointPosition = ctx.getAttribute("tmp.resource-allocator.end-point-position"); + if (endPointPosition != null && endPointPosition.trim().length() > 0) + sd.put("end-point-position", endPointPosition.trim()); + + String resourceName = ctx.getAttribute("tmp.resource-allocator.resource-name"); + if (resourceName != null && resourceName.trim().length() > 0) + sd.put("resource-name", resourceName.trim()); + + String resourceShareGroup = ctx.getAttribute("tmp.resource-allocator.resource-share-group"); + if (resourceShareGroup != null && resourceShareGroup.trim().length() > 0) + sd.put("resource-share-group", resourceShareGroup.trim()); + + String serviceInstanceId = ctx.getAttribute("tmp.resource-allocator.service-instance-id"); + if (serviceInstanceId == null) + serviceInstanceId = "checkServiceInstance"; + sd.put("service-instance-id", serviceInstanceId); + + String speedStr = ctx.getAttribute("tmp.resource-allocator.speed"); + if (speedStr != null && speedStr.trim().length() > 0) { + long speed = 0; + try { + speed = Long.parseLong(speedStr); + } catch (NumberFormatException e) { + throw new SvcLogicException("Invalid tmp.resource-allocator.speed. Must be a number."); + } + String unit = ctx.getAttribute("tmp.resource-allocator.speed-unit"); + if (unit == null || unit.trim().length() == 0) + throw new SvcLogicException("tmp.resource-allocator.speed-unit is required in ResourceAllocator"); + long serviceSpeedKbps = speedUtil.convertToKbps(speed, unit); + + sd.put("service-speed-kbps", serviceSpeedKbps); + } + + String vpnId = ctx.getAttribute("tmp.resource-allocator.vpn-id"); + if (vpnId != null && vpnId.trim().length() > 0) + sd.put("vpn-id", vpnId.trim()); + + String vpnIdList = ctx.getAttribute("tmp.resource-allocator.vpn-id-list"); + if (vpnIdList != null && vpnIdList.trim().length() > 0) + sd.put("vpn-id-list", vpnIdList.trim()); + + String vrfName = ctx.getAttribute("tmp.resource-allocator.vrf-name"); + if (vrfName != null && vrfName.trim().length() > 0) + sd.put("vrf-name", vrfName.trim()); + + String vrfNameList = ctx.getAttribute("tmp.resource-allocator.vrf-name-list"); + if (vrfNameList != null && vrfNameList.trim().length() > 0) + sd.put("vrf-name-list", vrfNameList.trim()); + + String v4multicast = ctx.getAttribute("tmp.resource-allocator.v4-multicast"); + if (v4multicast != null && v4multicast.trim().length() > 0) + sd.put("v4-multicast", v4multicast.trim()); + + String v6multicast = ctx.getAttribute("tmp.resource-allocator.v6-multicast"); + if (v6multicast != null && v6multicast.trim().length() > 0) + sd.put("v6-multicast", v6multicast.trim()); + + String v4ServingSite = ctx.getAttribute("tmp.resource-allocator.v4-serving-site"); + if (v4ServingSite != null && v4ServingSite.trim().length() > 0) + sd.put("v4-serving-site", v4ServingSite.trim()); + + String v6ServingSite = ctx.getAttribute("tmp.resource-allocator.v6-serving-site"); + if (v6ServingSite != null && v6ServingSite.trim().length() > 0) + sd.put("v6-serving-site", v6ServingSite.trim()); + + return sd; + } + + private Map getEquipConstraints(SvcLogicContext ctx) throws SvcLogicException { + Map mm = new HashMap(); + + String vrfRequired = ctx.getAttribute("tmp.resource-allocator.vrf-required"); + if (vrfRequired != null && vrfRequired.trim().length() > 0) + mm.put("vrf-required", vrfRequired.trim()); + + String clli = ctx.getAttribute("tmp.resource-allocator.clli"); + if (clli == null || clli.trim().length() == 0) + clli = ctx.getAttribute("tmp.resource-allocator.aic-site-id"); + if (clli != null) { + mm.put("clli", clli.trim()); + mm.put("aic-site-id", clli.trim()); + } + + String vpeName = ctx.getAttribute("tmp.resource-allocator.vpe-name"); + if (vpeName != null && vpeName.trim().length() > 0) + mm.put("vpe-name", vpeName.trim()); + + String vnfName = ctx.getAttribute("tmp.resource-allocator.device-name"); + if (vnfName != null && vnfName.trim().length() > 0) + mm.put("vnf-name", vnfName.trim()); + + String excludeVpeList = ctx.getAttribute("tmp.resource-allocator.exclude-vpe-list"); + if (excludeVpeList != null && excludeVpeList.trim().length() > 0) + mm.put("exclude-vpe-list", excludeVpeList.trim()); + + String uplinkCircuitCountStr = + ctx.getAttribute("tmp.resource-allocator.uplink-circuit-list.uplink-circuit_length"); + if (uplinkCircuitCountStr != null) { + long uplinkCircuitCount = 0; + try { + uplinkCircuitCount = Long.parseLong(uplinkCircuitCountStr); + } catch (NumberFormatException e) { + throw new SvcLogicException( + "Invalid tmp.resource-allocator.uplink-circuit-list.uplink-circuit_length. Must be a number."); + } + List> uplinkCircuitList = new ArrayList<>(); + for (int i = 0; i < uplinkCircuitCount; i++) { + String uplinkCircuitId = ctx.getAttribute( + "tmp.resource-allocator.uplink-circuit-list.uplink-circuit[" + i + "].uplink-circuit-id"); + String uplinkCircuitBandwidthStr = + ctx.getAttribute("tmp.resource-allocator.uplink-circuit-list.uplink-circuit[" + i + + "].uplink-circuit-bandwidth"); + String uplinkCircuitBandwidthUnit = + ctx.getAttribute("tmp.resource-allocator.uplink-circuit-list.uplink-circuit[" + i + + "].uplink-circuit-bandwidth-unit"); + + long uplinkCircuitBandwidth = 0; + try { + uplinkCircuitBandwidth = Long.parseLong(uplinkCircuitBandwidthStr); + } catch (NumberFormatException e) { + throw new SvcLogicException("Invalid tmp.resource-allocator.uplink-circuit-list.uplink-circuit[" + + i + "].uplink-circuit-id. Must be a number."); + } + + long uplinkCircuitBandwidthKbps = + speedUtil.convertToKbps(uplinkCircuitBandwidth, uplinkCircuitBandwidthUnit); + + Map uplinkCircuit = new HashMap(); + uplinkCircuit.put("uplink-circuit-id", uplinkCircuitId); + uplinkCircuit.put("uplink-circuit-bandwidth", uplinkCircuitBandwidthKbps); + uplinkCircuitList.add(uplinkCircuit); + } + mm.put("uplink-circuit-list", uplinkCircuitList); + } + + return mm; + } + + private void setOutputContext(SvcLogicContext ctx, long maxAvailableSpeed, String unit) { + ctx.setAttribute("tmp.resource-allocator-output.max-available-speed", String.valueOf(maxAvailableSpeed)); + ctx.setAttribute("tmp.resource-allocator-output.speed-unit", unit); + } + + private int calculatePrimaryServerCount(int serverCount, String ratioString) throws SvcLogicException { + String[] ss = ratioString.split(":"); + if (ss.length != 2) + throw new SvcLogicException("Invalid value for homing.pserver.sparing.ratio: " + ratioString); + + int n = 1, m = 1; + try { + n = Integer.parseInt(ss[0]); + m = Integer.parseInt(ss[1]); + } catch (Exception e) { + throw new SvcLogicException("Invalid value for homing.pserver.sparing.ratio: " + ratioString); + } + + return (serverCount - 1) * n / (n + m) + 1; + } + + public void setServerDao(ServerDao serverDao) { + this.serverDao = serverDao; + } + + public void setVpePortDao(VpePortDao vpePortDao) { + this.vpePortDao = vpePortDao; + } + + public void setVplspePortDao(VplspePortDao vplspePortDao) { + this.vplspePortDao = vplspePortDao; + } + + public void setMaxPortSpeedDao(MaxPortSpeedDao maxPortSpeedDao) { + this.maxPortSpeedDao = maxPortSpeedDao; + } + + public void setMaxServerSpeedDao(MaxServerSpeedDao maxServerSpeedDao) { + this.maxServerSpeedDao = maxServerSpeedDao; + } + + public void setAllocationRequestBuilder(AllocationRequestBuilder allocationRequestBuilder) { + this.allocationRequestBuilder = allocationRequestBuilder; + } + + public void setResourceManager(ResourceManager resourceManager) { + this.resourceManager = resourceManager; + } + + public void setSpeedUtil(SpeedUtil speedUtil) { + this.speedUtil = speedUtil; + } + + public void setServiceResourceDao(ServiceResourceDao serviceResourceDao) { + this.serviceResourceDao = serviceResourceDao; + } + + public void setEndPointAllocator(EndPointAllocator endPointAllocator) { + this.endPointAllocator = endPointAllocator; + } + + public void setParameterDao(ParameterDao parameterDao) { + this.parameterDao = parameterDao; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/alloc/AffinityAllocationRule.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/alloc/AffinityAllocationRule.java new file mode 100644 index 00000000..b77df92a --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/alloc/AffinityAllocationRule.java @@ -0,0 +1,68 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.alloc; + +import org.openecomp.sdnc.ra.comp.AllocationRule; +import org.openecomp.sdnc.ra.comp.ServiceData; +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.openecomp.sdnc.rm.data.AllocationAction; +import org.openecomp.sdnc.rm.data.AllocationRequest; +import org.openecomp.sdnc.rm.data.LimitAllocationRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AffinityAllocationRule implements AllocationRule { + + @SuppressWarnings("unused") + private static final Logger log = LoggerFactory.getLogger(AffinityAllocationRule.class); + + @Override + public AllocationRequest buildAllocationRequest( + String resourceUnionId, + String resourceSetId, + String endPointPosition, + ServiceData serviceData, + EquipmentData equipmentData, + boolean checkOnly, + boolean change) { + String affinityLink = (String) equipmentData.data.get("affinity-link"); + if (affinityLink == null) + affinityLink = "1"; + + long serviceSpeed = (Long) serviceData.data.get("service-speed-kbps"); + + LimitAllocationRequest ar = new LimitAllocationRequest(); + ar.resourceSetId = resourceSetId; + ar.resourceUnionId = resourceUnionId; + ar.resourceShareGroupList = null; + ar.resourceName = "Bandwidth"; + ar.assetId = equipmentData.equipmentId + "-" + affinityLink; + ar.missingResourceAction = AllocationAction.Succeed_Allocate; + ar.expiredResourceAction = AllocationAction.Succeed_Allocate; + ar.replace = true; + ar.strict = false; + ar.checkLimit = Long.MAX_VALUE; + ar.checkCount = 0; + ar.allocateCount = serviceSpeed; + return ar; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/alloc/DbAllocationRule.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/alloc/DbAllocationRule.java new file mode 100644 index 00000000..a066378a --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/alloc/DbAllocationRule.java @@ -0,0 +1,155 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.alloc; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.openecomp.sdnc.ra.comp.AllocationRule; +import org.openecomp.sdnc.ra.comp.ServiceData; +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.openecomp.sdnc.ra.rule.dao.RangeRuleDao; +import org.openecomp.sdnc.ra.rule.dao.ResourceRuleDao; +import org.openecomp.sdnc.ra.rule.data.RangeRule; +import org.openecomp.sdnc.ra.rule.data.ResourceRule; +import org.openecomp.sdnc.rm.data.AllocationAction; +import org.openecomp.sdnc.rm.data.AllocationRequest; +import org.openecomp.sdnc.rm.data.LimitAllocationRequest; +import org.openecomp.sdnc.rm.data.MultiResourceAllocationRequest; +import org.openecomp.sdnc.rm.data.RangeAllocationRequest; +import org.openecomp.sdnc.util.expr.ExpressionEvaluator; +import org.openecomp.sdnc.util.str.StrUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DbAllocationRule implements AllocationRule { + + private static final Logger log = LoggerFactory.getLogger(DbAllocationRule.class); + + private ResourceRuleDao resourceRuleDao; + private RangeRuleDao rangeRuleDao; + + @Override + public AllocationRequest buildAllocationRequest( + String resourceUnionId, + String resourceSetId, + String endPointPosition, + ServiceData serviceData, + EquipmentData equipmentData, + boolean checkOnly, + boolean change) { + List resourceRuleList = resourceRuleDao.getResourceRules(serviceData.serviceModel, + endPointPosition, equipmentData.equipmentLevel); + List rangeRuleList = + rangeRuleDao.getRangeRules(serviceData.serviceModel, endPointPosition, equipmentData.equipmentLevel); + + List arlist = new ArrayList(); + + for (ResourceRule rr : resourceRuleList) { + if (serviceData.resourceName != null && !serviceData.resourceName.equals(rr.resourceName)) + continue; + AllocationRequest ar1 = buildAllocationRequest(rr, resourceUnionId, resourceSetId, serviceData, + equipmentData, checkOnly, change); + arlist.add(ar1); + } + for (RangeRule rr : rangeRuleList) { + if (serviceData.resourceName != null && !serviceData.resourceName.equals(rr.rangeName)) + continue; + AllocationRequest ar1 = buildAllocationRequest(rr, resourceUnionId, resourceSetId, serviceData, + equipmentData, checkOnly, change); + arlist.add(ar1); + } + + if (arlist.isEmpty()) + return null; + + if (arlist.size() == 1) + return arlist.get(0); + + MultiResourceAllocationRequest ar = new MultiResourceAllocationRequest(); + ar.stopOnFirstFailure = false; + ar.allocationRequestList = arlist; + return ar; + } + + private AllocationRequest buildAllocationRequest( + ResourceRule resourceRule, + String resourceUnionId, + String resourceSetId, + ServiceData serviceData, + EquipmentData equipmentData, + boolean checkOnly, + boolean change) { + StrUtil.info(log, resourceRule); + + LimitAllocationRequest ar = new LimitAllocationRequest(); + ar.resourceSetId = resourceSetId; + ar.resourceUnionId = resourceUnionId; + ar.resourceName = resourceRule.resourceName; + if (serviceData.resourceShareGroup != null) + ar.resourceShareGroupList = Collections.singleton(serviceData.resourceShareGroup); + ar.assetId = equipmentData.equipmentId; + ar.missingResourceAction = AllocationAction.Succeed_Allocate; + ar.expiredResourceAction = AllocationAction.Succeed_Allocate; + ar.replace = true; + ar.strict = false; + ar.checkLimit = ExpressionEvaluator.evalLong( + change ? resourceRule.hardLimitExpression : resourceRule.softLimitExpression, equipmentData.data);; + ar.checkCount = ExpressionEvaluator.evalLong(resourceRule.allocationExpression, serviceData.data); + ar.allocateCount = checkOnly ? 0 : ar.checkCount; + return ar; + } + + private AllocationRequest buildAllocationRequest( + RangeRule rangeRule, + String resourceUnionId, + String resourceSetId, + ServiceData serviceData, + EquipmentData equipmentData, + boolean checkOnly, + boolean change) { + StrUtil.info(log, rangeRule); + + RangeAllocationRequest ar = new RangeAllocationRequest(); + ar.resourceSetId = resourceSetId; + ar.resourceUnionId = resourceUnionId; + ar.resourceName = rangeRule.rangeName; + ar.assetId = equipmentData.equipmentId; + ar.missingResourceAction = AllocationAction.Succeed_Allocate; + ar.expiredResourceAction = AllocationAction.Succeed_Allocate; + ar.replace = true; + ar.check = true; + ar.allocate = !checkOnly; + ar.checkMin = rangeRule.minValue; + ar.checkMax = rangeRule.maxValue; + return ar; + } + + public void setResourceRuleDao(ResourceRuleDao resourceRuleDao) { + this.resourceRuleDao = resourceRuleDao; + } + + public void setRangeRuleDao(RangeRuleDao rangeRuleDao) { + this.rangeRuleDao = rangeRuleDao; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/alloc/ServingSiteAllocationRule.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/alloc/ServingSiteAllocationRule.java new file mode 100644 index 00000000..cb36a8be --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/alloc/ServingSiteAllocationRule.java @@ -0,0 +1,80 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.alloc; + +import org.openecomp.sdnc.ra.comp.AllocationRule; +import org.openecomp.sdnc.ra.comp.ServiceData; +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.openecomp.sdnc.rm.data.AllocationAction; +import org.openecomp.sdnc.rm.data.AllocationRequest; +import org.openecomp.sdnc.rm.data.LimitAllocationRequest; +import org.openecomp.sdnc.util.vrf.VpnParam; +import org.openecomp.sdnc.util.vrf.VrfUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ServingSiteAllocationRule implements AllocationRule { + + private static final Logger log = LoggerFactory.getLogger(ServingSiteAllocationRule.class); + + @Override + public AllocationRequest buildAllocationRequest( + String resourceUnionId, + String resourceSetId, + String endPointPosition, + ServiceData serviceData, + EquipmentData equipmentData, + boolean checkOnly, + boolean change) { + String vrfName = (String) serviceData.data.get("vrf-name"); + if (vrfName == null) + return null; + + log.info("vrfName: " + vrfName); + + String v4ServingSiteStr = (String) serviceData.data.get("v4-serving-site"); + String v6ServingSiteStr = (String) serviceData.data.get("v6-serving-site"); + boolean v4ServingSite = v4ServingSiteStr != null && + (v4ServingSiteStr.equalsIgnoreCase("Y") || v4ServingSiteStr.equalsIgnoreCase("true")); + boolean v6ServingSite = v6ServingSiteStr != null && + (v6ServingSiteStr.equalsIgnoreCase("Y") || v6ServingSiteStr.equalsIgnoreCase("true")); + if (!v4ServingSite && !v6ServingSite) + return null; + + VpnParam vpnp = VrfUtil.parseVrfInstanceName(vrfName); + + LimitAllocationRequest ar = new LimitAllocationRequest(); + ar.resourceSetId = resourceSetId; + ar.resourceUnionId = resourceUnionId; + ar.resourceName = "ServingSite"; + ar.assetId = equipmentData.equipmentId + "-" + vpnp.vpnId; + ar.missingResourceAction = AllocationAction.Succeed_Allocate; + ar.expiredResourceAction = AllocationAction.Succeed_Allocate; + ar.replace = true; + ar.strict = false; + ar.checkLimit = 1; + ar.checkCount = 1; + ar.allocateCount = 1; + + return ar; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/alloc/VrfAllocationRule.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/alloc/VrfAllocationRule.java new file mode 100644 index 00000000..f23f1e98 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/alloc/VrfAllocationRule.java @@ -0,0 +1,111 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.alloc; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; + +import org.openecomp.sdnc.ra.comp.AllocationRule; +import org.openecomp.sdnc.ra.comp.ServiceData; +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.openecomp.sdnc.rm.data.AllocationAction; +import org.openecomp.sdnc.rm.data.AllocationRequest; +import org.openecomp.sdnc.rm.data.LimitAllocationRequest; +import org.openecomp.sdnc.rm.data.MultiResourceAllocationRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class VrfAllocationRule implements AllocationRule { + + private static final Logger log = LoggerFactory.getLogger(VrfAllocationRule.class); + + @Override + public AllocationRequest buildAllocationRequest( + String resourceUnionId, + String resourceSetId, + String endPointPosition, + ServiceData serviceData, + EquipmentData equipmentData, + boolean checkOnly, + boolean change) { + String vrfName = (String) serviceData.data.get("vrf-name"); + if (vrfName == null) + return null; + + log.info("vrfName: " + vrfName); + + Set resourceShareGroupList = new HashSet<>(); + resourceShareGroupList.add(vrfName); + + LimitAllocationRequest ar = new LimitAllocationRequest(); + ar.resourceSetId = resourceSetId; + ar.resourceUnionId = resourceUnionId; + ar.resourceShareGroupList = resourceShareGroupList; + ar.resourceName = "VRF"; + ar.assetId = equipmentData.equipmentId; + ar.missingResourceAction = AllocationAction.Succeed_Allocate; + ar.expiredResourceAction = AllocationAction.Succeed_Allocate; + ar.replace = true; + ar.strict = false; + ar.checkLimit = 999999999; + ar.checkCount = 1; + ar.allocateCount = 1; + + String v4MulticastStr = (String) serviceData.data.get("v4-multicast"); + String v6MulticastStr = (String) serviceData.data.get("v6-multicast"); + boolean v4Multicast = v4MulticastStr != null && + (v4MulticastStr.equalsIgnoreCase("Y") || v4MulticastStr.equalsIgnoreCase("true")); + boolean v6Multicast = v6MulticastStr != null && + (v6MulticastStr.equalsIgnoreCase("Y") || v6MulticastStr.equalsIgnoreCase("true")); + if (v4Multicast || v6Multicast) { + LimitAllocationRequest ar2 = new LimitAllocationRequest(); + ar2.resourceSetId = resourceSetId; + ar2.resourceUnionId = resourceUnionId; + ar2.resourceShareGroupList = resourceShareGroupList; + ar2.resourceName = "MVRF"; + ar2.assetId = equipmentData.equipmentId; + ar2.missingResourceAction = AllocationAction.Succeed_Allocate; + ar2.expiredResourceAction = AllocationAction.Succeed_Allocate; + ar2.replace = true; + ar2.strict = false; + ar2.checkLimit = 999999999; + ar2.checkCount = 1; + ar2.allocateCount = 1; + + MultiResourceAllocationRequest mar = new MultiResourceAllocationRequest(); + mar.resourceSetId = resourceSetId; + mar.resourceUnionId = resourceUnionId; + mar.resourceShareGroupList = resourceShareGroupList; + mar.assetId = equipmentData.equipmentId; + mar.missingResourceAction = AllocationAction.Succeed_Allocate; + mar.expiredResourceAction = AllocationAction.Succeed_Allocate; + mar.allocationRequestList = new ArrayList<>(); + mar.allocationRequestList.add(ar); + mar.allocationRequestList.add(ar2); + + return mar; + } + + return ar; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/AnyVrfPresentCheck.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/AnyVrfPresentCheck.java new file mode 100644 index 00000000..aee761c7 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/AnyVrfPresentCheck.java @@ -0,0 +1,74 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.check; + +import java.util.Map; + +import org.openecomp.sdnc.ra.comp.EquipmentCheck; +import org.openecomp.sdnc.ra.comp.ServiceData; +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.openecomp.sdnc.rm.comp.ResourceManager; +import org.openecomp.sdnc.rm.data.AllocationItem; +import org.openecomp.sdnc.rm.data.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AnyVrfPresentCheck implements EquipmentCheck { + + private static final Logger log = LoggerFactory.getLogger(AnyVrfPresentCheck.class); + + private ResourceManager resourceManager; + + @Override + public boolean checkEquipment( + String endPointPosition, + ServiceData serviceData, + EquipmentData equipData, + Map equipmentConstraints) { + String vrfNameListStr = (String) serviceData.data.get("vrf-name-list"); + if (vrfNameListStr == null) + vrfNameListStr = (String) serviceData.data.get("vrf-name"); + if (vrfNameListStr == null) + return true; + + String vrfRequiredStr = (String) equipmentConstraints.get("vrf-required"); + if (vrfRequiredStr == null || !vrfRequiredStr.equalsIgnoreCase("true")) + return true; + + String[] vrfNameList = vrfNameListStr.split(","); + + Resource r = resourceManager.getResource("VRF", equipData.equipmentId); + if (r != null && r.allocationItems != null) + for (AllocationItem ai : r.allocationItems) + for (String vrfName : vrfNameList) + if (ai.resourceShareGroupList.contains(vrfName)) + return true; + + log.info("Skipping VPE " + equipData.equipmentId + + ": Existing VRF is required, but there is no existing VRF on the VPE for any of the requested VPNs."); + return false; + } + + public void setResourceManager(ResourceManager resourceManager) { + this.resourceManager = resourceManager; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/ExcludeVpeCheck.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/ExcludeVpeCheck.java new file mode 100644 index 00000000..25571fb2 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/ExcludeVpeCheck.java @@ -0,0 +1,57 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.check; + +import java.util.Map; + +import org.openecomp.sdnc.ra.comp.EquipmentCheck; +import org.openecomp.sdnc.ra.comp.ServiceData; +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ExcludeVpeCheck implements EquipmentCheck { + + private static final Logger log = LoggerFactory.getLogger(ExcludeVpeCheck.class); + + @Override + public boolean checkEquipment( + String endPointPosition, + ServiceData serviceData, + EquipmentData equipData, + Map equipmentConstraints) { + String excludeVpeListStr = (String) equipmentConstraints.get("exclude-vpe-list"); + if (excludeVpeListStr == null) + return true; + + String vpeName = (String) equipData.data.get("vpe-id"); + + String[] excludeVpeList = excludeVpeListStr.split(","); + for (String excludeVpe : excludeVpeList) + if (excludeVpe.equals(vpeName)) { + log.info("Skipping VPE " + equipData.equipmentId + ": Present in the exclude VPE list."); + return false; + } + + return true; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/HubWithRgCheck.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/HubWithRgCheck.java new file mode 100644 index 00000000..6c2b4c59 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/HubWithRgCheck.java @@ -0,0 +1,107 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.check; + +import java.util.Map; + +import org.openecomp.sdnc.ra.comp.EquipmentCheck; +import org.openecomp.sdnc.ra.comp.ServiceData; +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.openecomp.sdnc.rm.comp.ResourceManager; +import org.openecomp.sdnc.rm.data.AllocationItem; +import org.openecomp.sdnc.rm.data.Resource; +import org.openecomp.sdnc.util.vrf.VpnParam; +import org.openecomp.sdnc.util.vrf.VrfUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HubWithRgCheck implements EquipmentCheck { + + private static final Logger log = LoggerFactory.getLogger(HubWithRgCheck.class); + + private ResourceManager resourceManager; + + @Override + public boolean checkEquipment( + String endPointPosition, + ServiceData serviceData, + EquipmentData equipData, + Map equipmentConstraints) { + String vrfName = (String) serviceData.data.get("vrf-name"); + if (vrfName == null) + return true; + + // Check if this is HUB. If not, this check is not applicable + VpnParam vpnp = VrfUtil.parseVrfInstanceName(vrfName); + if (vpnp.siteType == null || !vpnp.siteType.equals("HUB")) + return true; + + boolean rgPresent = vpnp.routeGroupName != null; + + // First check if a new VRF would be required. If not, we are good + Resource r = resourceManager.getResource("VRF", equipData.equipmentId); + if (r != null && r.allocationItems != null) { + for (AllocationItem ai : r.allocationItems) + if (ai.resourceShareGroupList.contains(vrfName)) + return true; + + String resourceUnionId = serviceData.serviceInstanceId + '/' + serviceData.endPointPosition; + + // Check if there is already another HUB VRF with RG presence that does not match the requested + for (AllocationItem ai : r.allocationItems) { + + // Skip the allocation item for the current service instance, if there, in case it is a change order + if (ai.resourceUnionId.equals(resourceUnionId)) + continue; + + if (ai.resourceShareGroupList != null && ai.resourceShareGroupList.size() > 0) { + String vrfName2 = ai.resourceShareGroupList.iterator().next(); + VpnParam vpnp2 = VrfUtil.parseVrfInstanceName(vrfName2); + + if (vpnp2.siteType == null || !vpnp2.siteType.equals("HUB")) + continue; + + boolean rgPresent2 = vpnp2.routeGroupName != null; + + if (rgPresent && !rgPresent2) { + log.info("Skipping VPE " + equipData.equipmentId + + ": This request requires new HUB with RG VRF, " + + "but there is already another HUB VRF with no RG: " + vrfName2 + "."); + return false; + } + if (!rgPresent && rgPresent2) { + log.info("Skipping VPE " + equipData.equipmentId + + ": This request requires new HUB VRF with no RG, " + + "but there is already another HUB with RG VRF: " + vrfName2 + "."); + return false; + } + } + } + } + + return true; + } + + public void setResourceManager(ResourceManager resourceManager) { + this.resourceManager = resourceManager; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/OneMVrfCheck.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/OneMVrfCheck.java new file mode 100644 index 00000000..56fd535e --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/OneMVrfCheck.java @@ -0,0 +1,100 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.check; + +import java.util.Map; + +import org.openecomp.sdnc.ra.comp.EquipmentCheck; +import org.openecomp.sdnc.ra.comp.ServiceData; +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.openecomp.sdnc.rm.comp.ResourceManager; +import org.openecomp.sdnc.rm.data.AllocationItem; +import org.openecomp.sdnc.rm.data.Resource; +import org.openecomp.sdnc.util.vrf.VpnParam; +import org.openecomp.sdnc.util.vrf.VrfUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class OneMVrfCheck implements EquipmentCheck { + + private static final Logger log = LoggerFactory.getLogger(OneMVrfCheck.class); + + private ResourceManager resourceManager; + + @Override + public boolean checkEquipment( + String endPointPosition, + ServiceData serviceData, + EquipmentData equipData, + Map equipmentConstraints) { + String vrfName = (String) serviceData.data.get("vrf-name"); + if (vrfName == null) + return true; + + String v4MulticastStr = (String) serviceData.data.get("v4-multicast"); + String v6MulticastStr = (String) serviceData.data.get("v6-multicast"); + boolean v4Multicast = v4MulticastStr != null && + (v4MulticastStr.equalsIgnoreCase("Y") || v4MulticastStr.equalsIgnoreCase("true")); + boolean v6Multicast = v6MulticastStr != null && + (v6MulticastStr.equalsIgnoreCase("Y") || v6MulticastStr.equalsIgnoreCase("true")); + if (!v4Multicast && !v6Multicast) + return true; + + // First check if a new VRF would be required. If not, we are good + Resource r = resourceManager.getResource("VRF", equipData.equipmentId); + if (r != null && r.allocationItems != null) + for (AllocationItem ai : r.allocationItems) + if (ai.resourceShareGroupList.contains(vrfName)) + return true; + + String resourceUnionId = serviceData.serviceInstanceId + '/' + serviceData.endPointPosition; + + // Check if there is already another multicast VRF for the same VPN + VpnParam vpnp = VrfUtil.parseVrfInstanceName(vrfName); + r = resourceManager.getResource("MVRF", equipData.equipmentId); + if (r != null && r.allocationItems != null) { + for (AllocationItem ai : r.allocationItems) { + + // Skip the allocation item for the current service instance, if there, in case it is a change order + if (ai.resourceUnionId.equals(resourceUnionId)) + continue; + + if (ai.resourceShareGroupList != null && ai.resourceShareGroupList.size() > 0) { + String vrfName2 = ai.resourceShareGroupList.iterator().next(); + VpnParam vpnp2 = VrfUtil.parseVrfInstanceName(vrfName2); + if (vpnp.vpnId.equals(vpnp2.vpnId)) { + log.info("Skipping VPE " + equipData.equipmentId + + ": This request requires new multicast VRF, " + + "but there is already another multicast VRF for the same VPN: " + vrfName2 + "."); + return false; + } + } + } + } + + return true; + } + + public void setResourceManager(ResourceManager resourceManager) { + this.resourceManager = resourceManager; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/ProvStatusCheck.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/ProvStatusCheck.java new file mode 100644 index 00000000..baed60eb --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/ProvStatusCheck.java @@ -0,0 +1,49 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.check; + +import java.util.Map; + +import org.openecomp.sdnc.ra.comp.EquipmentCheck; +import org.openecomp.sdnc.ra.comp.ServiceData; +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ProvStatusCheck implements EquipmentCheck { + + private static final Logger log = LoggerFactory.getLogger(ProvStatusCheck.class); + + @Override + public boolean checkEquipment( + String endPointPosition, + ServiceData serviceData, + EquipmentData equipData, + Map equipmentConstraints) { + String provStatus = (String) equipData.data.get("provisioning-status"); + if (provStatus == null || !provStatus.equals("PROV")) { + log.info("Skipping VPE " + equipData.equipmentId + ": Not in PROV status."); + return false; + } + return true; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/VlanSpeedCheck.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/VlanSpeedCheck.java new file mode 100644 index 00000000..4644a14a --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/VlanSpeedCheck.java @@ -0,0 +1,50 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.check; + +import java.util.Map; + +import org.openecomp.sdnc.ra.comp.EquipmentCheck; +import org.openecomp.sdnc.ra.comp.ServiceData; +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class VlanSpeedCheck implements EquipmentCheck { + + private static final Logger log = LoggerFactory.getLogger(VlanSpeedCheck.class); + + @Override + public boolean checkEquipment( + String endPointPosition, + ServiceData serviceData, + EquipmentData equipData, + Map equipmentConstraints) { + String vpeName = (String) equipData.data.get("vpe-id"); + Long serviceSpeed = (Long) serviceData.data.get("service-speed-kbps"); + if (serviceSpeed != null && serviceSpeed > 0 && serviceSpeed < 1000) { + log.info("Skipping VPE " + vpeName + ": Service speed < 1Mbps is not supported."); + return false; + } + return true; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/VpeLockCheck.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/VpeLockCheck.java new file mode 100644 index 00000000..3b350b41 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/VpeLockCheck.java @@ -0,0 +1,111 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.check; + +import java.util.Map; + +import org.openecomp.sdnc.ra.comp.EquipmentCheck; +import org.openecomp.sdnc.ra.comp.ServiceData; +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.openecomp.sdnc.ra.rule.dao.VpeLockDao; +import org.openecomp.sdnc.rm.comp.ResourceManager; +import org.openecomp.sdnc.rm.data.AllocationItem; +import org.openecomp.sdnc.rm.data.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class VpeLockCheck implements EquipmentCheck { + + private static final Logger log = LoggerFactory.getLogger(VpeLockCheck.class); + + private VpeLockDao vpeLockDao; + private ResourceManager resourceManager; + + @Override + public boolean checkEquipment( + String endPointPosition, + ServiceData serviceData, + EquipmentData equipData, + Map equipmentConstraints) { + String vrfName = (String) serviceData.data.get("vrf-name"); + if (vrfName == null) + return true; + + String vpeName = (String) equipData.data.get("vpe-id"); + String vpeLock = vpeLockDao.getVpeLock(vpeName); + if (vpeLock == null) + return true; + + if (vpeLock.equals("vpe-total-lock")) { + log.info("Skipping VPE " + vpeName + ": There is a " + vpeLock + " on it."); + return false; + } + + if (vpeLock.equals("vpe-vrf-lock") && requiresNewVrf(equipData.equipmentId, vrfName)) { + log.info("Skipping VPE " + vpeName + ": There is a " + vpeLock + + " on it and it requires a new VRF for VPN: " + vrfName + "."); + return false; + } + + if (vpeLock.equals("vpe-mvrf-lock") && requiresNewMVrf(equipData.equipmentId, vrfName)) { + log.info("Skipping VPE " + vpeName + ": There is a " + vpeLock + + " on it and it requires a new multicast VRF for VPN: " + vrfName + "."); + return false; + } + + return true; + } + + boolean requiresNewVrf(String equipmentId, String vrfName) { + Resource r = resourceManager.getResource("VRF", equipmentId); + if (r == null || r.allocationItems == null) + return true; + + for (AllocationItem ai : r.allocationItems) { + if (ai.resourceShareGroupList.contains(vrfName)) + return false; + } + + return true; + } + + boolean requiresNewMVrf(String equipmentId, String vrfName) { + Resource r = resourceManager.getResource("MVRF", equipmentId); + if (r == null || r.allocationItems == null) + return true; + + for (AllocationItem ai : r.allocationItems) { + if (ai.resourceShareGroupList.contains(vrfName)) + return false; + } + + return true; + } + + public void setVpeLockDao(VpeLockDao vpeLockDao) { + this.vpeLockDao = vpeLockDao; + } + + public void setResourceManager(ResourceManager resourceManager) { + this.resourceManager = resourceManager; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/AllocationRule.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/AllocationRule.java new file mode 100644 index 00000000..0877933b --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/AllocationRule.java @@ -0,0 +1,37 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.comp; + +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.openecomp.sdnc.rm.data.AllocationRequest; + +public interface AllocationRule { + + AllocationRequest buildAllocationRequest( + String resourceUnionId, + String resourceSetId, + String endPointPosition, + ServiceData serviceData, + EquipmentData equipmentData, + boolean checkOnly, + boolean change); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/EndPointAllocationDefinition.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/EndPointAllocationDefinition.java new file mode 100644 index 00000000..21e49c3a --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/EndPointAllocationDefinition.java @@ -0,0 +1,60 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.comp; + +import java.util.List; + +import org.openecomp.sdnc.ra.equip.comp.EquipmentReader; + +public class EndPointAllocationDefinition { + + public String serviceModel; + public String endPointPosition; + public EquipmentReader equipmentReader; + public List equipmentCheckList; + public List preferenceRuleList; + public List allocationRuleList; + + public void setServiceModel(String serviceModel) { + this.serviceModel = serviceModel; + } + + public void setEndPointPosition(String endPointPosition) { + this.endPointPosition = endPointPosition; + } + + public void setEquipmentReader(EquipmentReader equipmentReader) { + this.equipmentReader = equipmentReader; + } + + public void setEquipmentCheckList(List equipmentCheckList) { + this.equipmentCheckList = equipmentCheckList; + } + + public void setPreferenceRuleList(List preferenceRuleList) { + this.preferenceRuleList = preferenceRuleList; + } + + public void setAllocationRuleList(List allocationRuleList) { + this.allocationRuleList = allocationRuleList; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/EndPointAllocator.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/EndPointAllocator.java new file mode 100644 index 00000000..645c953c --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/EndPointAllocator.java @@ -0,0 +1,35 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.comp; + +import java.util.List; +import java.util.Map; + +public interface EndPointAllocator { + + List allocateEndPoints( + ServiceData serviceData, + Map equipmentConstraints, + boolean checkOnly, + boolean change, + int changeNumber); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/EndPointAllocatorImpl.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/EndPointAllocatorImpl.java new file mode 100644 index 00000000..1af81434 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/EndPointAllocatorImpl.java @@ -0,0 +1,214 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.comp; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.NotImplementedException; +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.openecomp.sdnc.rm.comp.ResourceManager; +import org.openecomp.sdnc.rm.data.AllocationItem; +import org.openecomp.sdnc.rm.data.AllocationOutcome; +import org.openecomp.sdnc.rm.data.AllocationRequest; +import org.openecomp.sdnc.rm.data.AllocationStatus; +import org.openecomp.sdnc.rm.data.LimitAllocationItem; +import org.openecomp.sdnc.rm.data.LimitResource; +import org.openecomp.sdnc.rm.data.RangeAllocationItem; +import org.openecomp.sdnc.rm.data.RangeResource; +import org.openecomp.sdnc.rm.data.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class EndPointAllocatorImpl implements EndPointAllocator { + + private static final Logger log = LoggerFactory.getLogger(EndPointAllocatorImpl.class); + + private Map> endPointAllocationDefinitionMap; + + private ResourceManager resourceManager; + + @Override + public List allocateEndPoints( + ServiceData serviceData, + Map equipmentConstraints, + boolean checkOnly, + boolean change, + int changeNumber) { + List defList = endPointAllocationDefinitionMap.get(serviceData.serviceModel); + if (defList == null) + throw new NotImplementedException("Service model: " + serviceData.serviceModel + " not supported"); + + List epList = new ArrayList<>(); + for (EndPointAllocationDefinition def : defList) { + if (serviceData.endPointPosition != null && !serviceData.endPointPosition.equals(def.endPointPosition)) + continue; + + log.info( + "Starting allocation of end point: " + def.endPointPosition + ": " + serviceData.serviceInstanceId); + + String resourceUnionId = serviceData.serviceInstanceId + '/' + def.endPointPosition; + String resourceSetId = resourceUnionId + '/' + changeNumber; + + String equipmentId = (String) equipmentConstraints.get("equipment-id"); + if (equipmentId == null) { + EndPointData epExisting = readEndPoint(resourceUnionId, resourceSetId); + if (epExisting != null && epExisting.equipmentId != null) { + equipmentConstraints.put("equipment-id", epExisting.equipmentId); + + log.info("Trying assignment on the current equipment: " + epExisting.equipmentId); + } + } + + List equipList = def.equipmentReader.readEquipment(equipmentConstraints); + if (equipList == null || equipList.isEmpty()) { + log.info("Equipment not found for " + def.endPointPosition); + break; + } + + if (def.equipmentCheckList != null) { + for (EquipmentCheck filter : def.equipmentCheckList) { + List newEquipList = new ArrayList<>(); + for (EquipmentData equipData : equipList) + if (filter.checkEquipment(def.endPointPosition, serviceData, equipData, equipmentConstraints)) + newEquipList.add(equipData); + equipList = newEquipList; + } + if (equipList.isEmpty()) { + log.info("No equipment meets the requiremets for the service for: " + def.endPointPosition); + break; + } + } + + if (equipList.size() > 1 && def.preferenceRuleList != null && !def.preferenceRuleList.isEmpty()) { + + List prefEquipList = new ArrayList<>(); + for (EquipmentData equipData : equipList) { + PrefEquipment prefEquip = new PrefEquipment(); + prefEquip.equipData = equipData; + prefEquip.prefNumbers = new long[def.preferenceRuleList.size()]; + prefEquipList.add(prefEquip); + + int i = 0; + for (PreferenceRule prefRule : def.preferenceRuleList) + prefEquip.prefNumbers[i++] = + prefRule.assignOrderNumber(def.endPointPosition, serviceData, equipData); + } + + Collections.sort(prefEquipList); + + equipList = new ArrayList<>(); + for (PrefEquipment prefEquip : prefEquipList) + equipList.add(prefEquip.equipData); + } + + for (EquipmentData equipData : equipList) { + boolean allgood = true; + if (def.allocationRuleList != null) + for (AllocationRule allocationRule : def.allocationRuleList) { + AllocationRequest ar = allocationRule.buildAllocationRequest(resourceUnionId, resourceSetId, + def.endPointPosition, serviceData, equipData, checkOnly, change); + if (ar != null) { + AllocationOutcome ao = resourceManager.allocateResources(ar); + if (ao.status != AllocationStatus.Success) { + allgood = false; + break; + } + } + } + if (allgood) { + EndPointData ep = readEndPoint(resourceUnionId, resourceSetId); + epList.add(ep); + break; + } + } + } + + return epList; + } + + private EndPointData readEndPoint(String resourceUnionId, String resourceSetId) { + EndPointData ep = new EndPointData(); + ep.resourceUnionId = resourceUnionId; + ep.resourceSetId = resourceSetId; + + int i1 = resourceUnionId.indexOf('/'); + if (i1 > 0) + ep.endPointPosition = resourceUnionId.substring(i1 + 1); + + ep.data = new HashMap<>(); + + List rlist = resourceManager.getResourceUnion(resourceUnionId); + for (Resource r : rlist) { + if (r instanceof RangeResource) { + RangeResource rr = (RangeResource) r; + for (AllocationItem ai : r.allocationItems) + if (ai.resourceUnionId.equals(resourceUnionId)) { + RangeAllocationItem rai = (RangeAllocationItem) ai; + ep.data.put(ep.endPointPosition + '.' + rr.resourceKey.resourceName, rai.used.first()); + } + } + if (r instanceof LimitResource) { + LimitResource rr = (LimitResource) r; + for (AllocationItem ai : r.allocationItems) + if (ai.resourceUnionId.equals(resourceUnionId)) { + LimitAllocationItem rai = (LimitAllocationItem) ai; + ep.data.put(ep.endPointPosition + '.' + rr.resourceKey.resourceName + ".allocated", rai.used); + ep.data.put(ep.endPointPosition + '.' + rr.resourceKey.resourceName + ".used", rr.used); + ep.data.put(ep.endPointPosition + '.' + rr.resourceKey.resourceName + ".assetId", + r.resourceKey.assetId); + } + } + } + + return ep; + } + + private static class PrefEquipment implements Comparable { + + public long[] prefNumbers; + public EquipmentData equipData; + + @Override + public int compareTo(PrefEquipment o) { + for (int i = 0; i < prefNumbers.length; i++) { + if (prefNumbers[i] < o.prefNumbers[i]) + return -1; + if (prefNumbers[i] > o.prefNumbers[i]) + return 1; + } + return 0; + } + } + + public void setEndPointAllocationDefinitionMap( + Map> endPointAllocationDefinitionMap) { + this.endPointAllocationDefinitionMap = endPointAllocationDefinitionMap; + } + + public void setResourceManager(ResourceManager resourceManager) { + this.resourceManager = resourceManager; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/EndPointData.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/EndPointData.java new file mode 100644 index 00000000..e425e373 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/EndPointData.java @@ -0,0 +1,33 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.comp; + +import java.util.Map; + +public class EndPointData { + + public String resourceSetId; + public String resourceUnionId; + public String endPointPosition; + public String equipmentId; + public Map data; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/EquipmentCheck.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/EquipmentCheck.java new file mode 100644 index 00000000..fcca4f7c --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/EquipmentCheck.java @@ -0,0 +1,35 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.comp; + +import java.util.Map; + +import org.openecomp.sdnc.ra.equip.data.EquipmentData; + +public interface EquipmentCheck { + + boolean checkEquipment( + String endPointPosition, + ServiceData serviceData, + EquipmentData equipData, + Map equipmentConstraints); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/PreferenceRule.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/PreferenceRule.java new file mode 100644 index 00000000..acaf10d9 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/PreferenceRule.java @@ -0,0 +1,30 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.comp; + +import org.openecomp.sdnc.ra.equip.data.EquipmentData; + +public interface PreferenceRule { + + // Smaller order number is preferred + int assignOrderNumber(String endPointPosition, ServiceData serviceData, EquipmentData equipData); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/ServiceData.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/ServiceData.java new file mode 100644 index 00000000..0d29e54f --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/ServiceData.java @@ -0,0 +1,36 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.comp; + +import java.util.Map; + +public class ServiceData { + + public String serviceModel; + public String serviceInstanceId; + public String resourceSetId; + public String resourceUnionId; + public String resourceShareGroup; + public String endPointPosition; + public String resourceName; + public Map data; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/comp/EquipmentReader.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/comp/EquipmentReader.java new file mode 100644 index 00000000..a380594b --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/comp/EquipmentReader.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.equip.comp; + +import java.util.List; +import java.util.Map; + +import org.openecomp.sdnc.ra.equip.data.EquipmentData; + +public interface EquipmentReader { + + List readEquipment(Map equipmentConstraints); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/ServerDao.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/ServerDao.java new file mode 100644 index 00000000..44873873 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/ServerDao.java @@ -0,0 +1,30 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.equip.dao; + +import java.util.List; +import java.util.Map; + +public interface ServerDao { + + List> getServerData(String aicSiteId); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/ServerDaoImpl.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/ServerDaoImpl.java new file mode 100644 index 00000000..e1bc2a5a --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/ServerDaoImpl.java @@ -0,0 +1,64 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.equip.dao; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.JdbcTemplate; + +public class ServerDaoImpl implements ServerDao { + + private static final Logger log = LoggerFactory.getLogger(ServerDaoImpl.class); + + private static final String GET_SERVER_COUNT_SQL = "SELECT count(*) FROM PSERVER WHERE aic_site_id = ?"; + + private JdbcTemplate jdbcTemplate; + + @Override + public List> getServerData(String aicSiteId) { + List> ll = new ArrayList>(); + Map sd = new HashMap(); + sd.put("aic-site-id", aicSiteId); + sd.put("server-id", aicSiteId + "/Server1"); + sd.put("server-model", "Unknown"); + sd.put("server-count", getServerCount(aicSiteId)); + ll.add(sd); + return ll; + } + + private int getServerCount(String aicSiteId) { + int n = jdbcTemplate.queryForInt(GET_SERVER_COUNT_SQL, aicSiteId); + + log.info("Number of servers in " + aicSiteId + ": " + n); + + return n; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/VpePortDao.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/VpePortDao.java new file mode 100644 index 00000000..4a0f6b8c --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/VpePortDao.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.equip.dao; + +import java.util.List; +import java.util.Map; + +public interface VpePortDao { + + List> getVpePortData(String aicSiteId); + + List> getVpePortData(String aicSiteId, String vpeName); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/VpePortDaoImpl.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/VpePortDaoImpl.java new file mode 100644 index 00000000..d25fe9c4 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/VpePortDaoImpl.java @@ -0,0 +1,81 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.equip.dao; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; + +public class VpePortDaoImpl implements VpePortDao { + + @SuppressWarnings("unused") + private static final Logger log = LoggerFactory.getLogger(VpePortDaoImpl.class); + + private static final String GET_SQL = "SELECT * FROM VPE_POOL WHERE aic_site_id = ?"; + private static final String GET2_SQL = "SELECT * FROM VPE_POOL WHERE vpe_name = ?"; + private static final String GET3_SQL = + "SELECT * FROM VPE_POOL WHERE substring(aic_site_id, 1, 8) = substring(?, 1, 8)"; + + private JdbcTemplate jdbcTemplate; + + @Override + public List> getVpePortData(String aicSiteId) { + return jdbcTemplate.query(GET_SQL, new Object[] { aicSiteId }, new VpePortRowMapper()); + } + + @Override + public List> getVpePortData(String aicSiteId, String vpeName) { + String sql = vpeName != null ? GET2_SQL : GET3_SQL; + Object[] param = new Object[] { vpeName != null ? vpeName : aicSiteId }; + + return jdbcTemplate.query(sql, param, new VpePortRowMapper()); + } + + private static class VpePortRowMapper implements RowMapper> { + + @Override + public Map mapRow(ResultSet rs, int rowNum) throws SQLException { + Map mm = new HashMap(); + mm.put("vpe-id", rs.getString("vpe_name")); + mm.put("aic-site-id", rs.getString("aic_site_id")); + mm.put("availability-zone", rs.getString("availability_zone")); + mm.put("image-file-name", rs.getString("image_filename")); + mm.put("vendor", rs.getString("vendor")); + mm.put("provisioning-status", rs.getString("provisioning_status")); + mm.put("physical-interface-name", rs.getString("physical_intf_name")); + mm.put("physical-interface-speed", rs.getLong("physical_intf_speed")); + mm.put("physical-interface-speed-unit", rs.getString("physical_intf_units")); + return mm; + } + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/VplspePortDao.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/VplspePortDao.java new file mode 100644 index 00000000..879a233d --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/VplspePortDao.java @@ -0,0 +1,30 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.equip.dao; + +import java.util.List; +import java.util.Map; + +public interface VplspePortDao { + + List> getVplspePortData(String aicSiteId); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/VplspePortDaoImpl.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/VplspePortDaoImpl.java new file mode 100644 index 00000000..bad64641 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/VplspePortDaoImpl.java @@ -0,0 +1,70 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.equip.dao; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; + +public class VplspePortDaoImpl implements VplspePortDao { + + @SuppressWarnings("unused") + private static final Logger log = LoggerFactory.getLogger(VplspePortDaoImpl.class); + + private static final String GET_SQL = "SELECT * FROM VPLSPE_POOL WHERE aic_site_id = ?"; + + private JdbcTemplate jdbcTemplate; + + @Override + public List> getVplspePortData(String aicSiteId) { + List> ll = + jdbcTemplate.query(GET_SQL, new Object[] { aicSiteId }, new RowMapper>() { + + @Override + public Map mapRow(ResultSet rs, int rowNum) throws SQLException { + Map mm = new HashMap(); + mm.put("vplspe-id", rs.getString("vplspe_name")); + mm.put("aic-site-id", rs.getString("aic_site_id")); + mm.put("availability-zone", rs.getString("availability_zone")); + mm.put("image-file-name", rs.getString("image_filename")); + mm.put("vendor", rs.getString("vendor")); + mm.put("provisioning-status", rs.getString("provisioning_status")); + mm.put("physical-interface-name", rs.getString("physical_intf_name")); + mm.put("physical-interface-speed", rs.getLong("physical_intf_speed")); + mm.put("physical-interface-speed-unit", rs.getString("physical_intf_units")); + return mm; + } + }); + return ll; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/data/EquipmentData.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/data/EquipmentData.java new file mode 100644 index 00000000..d485224b --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/data/EquipmentData.java @@ -0,0 +1,31 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.equip.data; + +import java.util.Map; + +public class EquipmentData { + + public String equipmentId; + public EquipmentLevel equipmentLevel; + public Map data; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/data/EquipmentLevel.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/data/EquipmentLevel.java new file mode 100644 index 00000000..44ae593a --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/data/EquipmentLevel.java @@ -0,0 +1,26 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.equip.data; + +public enum EquipmentLevel { + Port, Device, Server, Site +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/pref/AffinityLinkPref.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/pref/AffinityLinkPref.java new file mode 100644 index 00000000..09af2081 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/pref/AffinityLinkPref.java @@ -0,0 +1,85 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.pref; + +import java.util.ArrayList; +import java.util.List; + +import org.openecomp.sdnc.ra.comp.PreferenceRule; +import org.openecomp.sdnc.ra.comp.ServiceData; +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.openecomp.sdnc.rm.comp.ResourceManager; +import org.openecomp.sdnc.rm.data.LimitResource; +import org.openecomp.sdnc.rm.data.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AffinityLinkPref implements PreferenceRule { + + private static final Logger log = LoggerFactory.getLogger(AffinityLinkPref.class); + + private ResourceManager resourceManager; + private List affinityLinkIdList; + + public AffinityLinkPref() { + // Set default values for affinity link ids (can be overridden by the spring config) + affinityLinkIdList = new ArrayList<>(); + affinityLinkIdList.add("1"); + affinityLinkIdList.add("2"); + } + + @Override + public int assignOrderNumber(String endPointPosition, ServiceData serviceData, EquipmentData equipData) { + + // This class does not really assign order number, but instead sets the affinity link with the lowest + // assigned bandwidth in the equipment data + + String preferedAffinityLinkId = "1"; + long lowestAssignedBw = Long.MAX_VALUE; + for (String affinityLinkId : affinityLinkIdList) { + String assetId = equipData.equipmentId + "-" + affinityLinkId; + Resource r = resourceManager.getResource("Bandwidth", assetId); + if (r != null) { + LimitResource ll = (LimitResource) r; + if (ll.used < lowestAssignedBw) { + lowestAssignedBw = ll.used; + preferedAffinityLinkId = affinityLinkId; + } + log.info("Assigned bandwidth on affinity link: " + assetId + ": " + ll.used); + } + } + + equipData.data.put("affinity-link", preferedAffinityLinkId); + + log.info("Prefered affinity link for " + equipData.equipmentId + ": " + preferedAffinityLinkId); + + return 0; + } + + public void setResourceManager(ResourceManager resourceManager) { + this.resourceManager = resourceManager; + } + + public void setAffinityLinkIdList(List affinityLinkIdList) { + this.affinityLinkIdList = affinityLinkIdList; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/pref/EvcExistingVrfPref.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/pref/EvcExistingVrfPref.java new file mode 100644 index 00000000..abef0a24 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/pref/EvcExistingVrfPref.java @@ -0,0 +1,60 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.pref; + +import org.openecomp.sdnc.ra.comp.PreferenceRule; +import org.openecomp.sdnc.ra.comp.ServiceData; +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.openecomp.sdnc.rm.comp.ResourceManager; +import org.openecomp.sdnc.rm.data.AllocationItem; +import org.openecomp.sdnc.rm.data.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class EvcExistingVrfPref implements PreferenceRule { + + private static final Logger log = LoggerFactory.getLogger(EvcExistingVrfPref.class); + + private ResourceManager resourceManager; + + @Override + public int assignOrderNumber(String endPointPosition, ServiceData serviceData, EquipmentData equipData) { + String vrfName = (String) serviceData.data.get("vrf-name"); + if (vrfName == null) + return 0; + + Resource r = resourceManager.getResource("VRF", equipData.equipmentId); + if (r != null && r.allocationItems != null) + for (AllocationItem ai : r.allocationItems) + if (ai.resourceShareGroupList.contains(vrfName)) { + log.info("VRF for VPN: " + vrfName + " found on VPE: " + equipData.equipmentId); + return 1; + } + + log.info("VRF for VPN: " + vrfName + " NOT found on VPE: " + equipData.equipmentId); + return 2; + } + + public void setResourceManager(ResourceManager resourceManager) { + this.resourceManager = resourceManager; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/reader/AicSiteReader.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/reader/AicSiteReader.java new file mode 100644 index 00000000..4040b0b4 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/reader/AicSiteReader.java @@ -0,0 +1,49 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.reader; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.openecomp.sdnc.ra.equip.comp.EquipmentReader; +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.openecomp.sdnc.ra.equip.data.EquipmentLevel; + +public class AicSiteReader implements EquipmentReader { + + @Override + public List readEquipment(Map equipmentConstraints) { + String aicSiteId = (String) equipmentConstraints.get("aic-site-id"); + + EquipmentData equipData = new EquipmentData(); + equipData.equipmentLevel = EquipmentLevel.Site; + equipData.equipmentId = aicSiteId; + equipData.data = new HashMap(); + + List equipList = new ArrayList<>(); + equipList.add(equipData); + + return equipList; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/reader/UplinkCircuitReader.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/reader/UplinkCircuitReader.java new file mode 100644 index 00000000..0adf6d12 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/reader/UplinkCircuitReader.java @@ -0,0 +1,54 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.reader; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.openecomp.sdnc.ra.equip.comp.EquipmentReader; +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.openecomp.sdnc.ra.equip.data.EquipmentLevel; + +public class UplinkCircuitReader implements EquipmentReader { + + @SuppressWarnings("unchecked") + @Override + public List readEquipment(Map equipmentConstraints) { + List equipList = new ArrayList<>(); + + List> uplinkCircuitList = + (List>) equipmentConstraints.get("uplink-circuit-list"); + if (uplinkCircuitList == null || uplinkCircuitList.isEmpty()) + return equipList; + + for (Map uplinkCircuit : uplinkCircuitList) { + EquipmentData equipData = new EquipmentData(); + equipData.equipmentLevel = EquipmentLevel.Device; + equipData.equipmentId = (String) uplinkCircuit.get("uplink-circuit-id"); + equipData.data = uplinkCircuit; + equipList.add(equipData); + } + + return equipList; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/reader/VnfReader.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/reader/VnfReader.java new file mode 100644 index 00000000..7039370a --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/reader/VnfReader.java @@ -0,0 +1,49 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.reader; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.openecomp.sdnc.ra.equip.comp.EquipmentReader; +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.openecomp.sdnc.ra.equip.data.EquipmentLevel; + +public class VnfReader implements EquipmentReader { + + @Override + public List readEquipment(Map equipmentConstraints) { + String vnfName = (String) equipmentConstraints.get("vnf-name"); + + EquipmentData equipData = new EquipmentData(); + equipData.equipmentLevel = EquipmentLevel.Device; + equipData.equipmentId = vnfName; + equipData.data = new HashMap(); + + List equipList = new ArrayList<>(); + equipList.add(equipData); + + return equipList; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/reader/VpePortReader.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/reader/VpePortReader.java new file mode 100644 index 00000000..360f7806 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/reader/VpePortReader.java @@ -0,0 +1,70 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.reader; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.openecomp.sdnc.ra.equip.comp.EquipmentReader; +import org.openecomp.sdnc.ra.equip.dao.VpePortDao; +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.openecomp.sdnc.ra.equip.data.EquipmentLevel; + +public class VpePortReader implements EquipmentReader { + + private VpePortDao vpePortDao; + + @Override + public List readEquipment(Map equipmentConstraints) { + String clli = (String) equipmentConstraints.get("clli"); + String vpeName = (String) equipmentConstraints.get("vpe-name"); + if (vpeName == null) { + String equipmentId = (String) equipmentConstraints.get("equipment-id"); + if (equipmentId != null) { + int i1 = equipmentId.indexOf('/'); + if (i1 > 0) + equipmentId = equipmentId.substring(0, i1); + vpeName = equipmentId; + } + } + + List> vpeDataList = vpePortDao.getVpePortData(clli, vpeName); + + List equipList = new ArrayList<>(); + for (Map vpeData : vpeDataList) { + EquipmentData equipData = new EquipmentData(); + equipData.equipmentLevel = EquipmentLevel.Port; + equipData.equipmentId = + (String) vpeData.get("vpe-id") + '/' + (String) vpeData.get("physical-interface-name"); + equipData.data = vpeData; + + equipList.add(equipData); + } + + return equipList; + } + + public void setVpePortDao(VpePortDao vpePortDao) { + this.vpePortDao = vpePortDao; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/comp/AllocationRequestBuilder.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/comp/AllocationRequestBuilder.java new file mode 100644 index 00000000..44e4c53a --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/comp/AllocationRequestBuilder.java @@ -0,0 +1,42 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.rule.comp; + +import org.openecomp.sdnc.ra.comp.ServiceData; +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.openecomp.sdnc.ra.rule.data.ThresholdStatus; +import org.openecomp.sdnc.rm.data.AllocationRequest; +import org.openecomp.sdnc.rm.data.LimitAllocationOutcome; + +public interface AllocationRequestBuilder { + + AllocationRequest buildAllocationRequest( + ServiceData serviceData, + EquipmentData equipmentData, + boolean checkOnly, + boolean change); + + ThresholdStatus getThresholdStatus( + ServiceData serviceData, + EquipmentData equipmentData, + LimitAllocationOutcome limitAllocationOutcome); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/comp/AllocationRequestBuilderImpl.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/comp/AllocationRequestBuilderImpl.java new file mode 100644 index 00000000..dbc0d8be --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/comp/AllocationRequestBuilderImpl.java @@ -0,0 +1,172 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.rule.comp; + +import java.util.ArrayList; +import java.util.List; + +import org.openecomp.sdnc.ra.comp.ServiceData; +import org.openecomp.sdnc.ra.equip.data.EquipmentData; +import org.openecomp.sdnc.ra.rule.dao.RangeRuleDao; +import org.openecomp.sdnc.ra.rule.dao.ResourceRuleDao; +import org.openecomp.sdnc.ra.rule.data.RangeRule; +import org.openecomp.sdnc.ra.rule.data.ResourceRule; +import org.openecomp.sdnc.ra.rule.data.ResourceThreshold; +import org.openecomp.sdnc.ra.rule.data.ThresholdStatus; +import org.openecomp.sdnc.rm.data.AllocationAction; +import org.openecomp.sdnc.rm.data.AllocationRequest; +import org.openecomp.sdnc.rm.data.LimitAllocationOutcome; +import org.openecomp.sdnc.rm.data.LimitAllocationRequest; +import org.openecomp.sdnc.rm.data.MultiResourceAllocationRequest; +import org.openecomp.sdnc.rm.data.RangeAllocationRequest; +import org.openecomp.sdnc.util.expr.ExpressionEvaluator; +import org.openecomp.sdnc.util.str.StrUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AllocationRequestBuilderImpl implements AllocationRequestBuilder { + + private static final Logger log = LoggerFactory.getLogger(AllocationRequestBuilderImpl.class); + + private ResourceRuleDao resourceRuleDao; + private RangeRuleDao rangeRuleDao; + + @Override + public AllocationRequest buildAllocationRequest( + ServiceData serviceData, + EquipmentData equipmentData, + boolean checkOnly, + boolean change) { + List resourceRuleList = resourceRuleDao.getResourceRules(serviceData.serviceModel, + serviceData.endPointPosition, equipmentData.equipmentLevel); + List rangeRuleList = rangeRuleDao.getRangeRules(serviceData.serviceModel, + serviceData.endPointPosition, equipmentData.equipmentLevel); + if (resourceRuleList.isEmpty() && rangeRuleList.isEmpty()) + return null; + if (resourceRuleList.size() == 1 && rangeRuleList.isEmpty()) + return buildAllocationRequest(resourceRuleList.get(0), serviceData, equipmentData, checkOnly, change); + + if (resourceRuleList.isEmpty() && rangeRuleList.size() == 1) + return buildAllocationRequest(rangeRuleList.get(0), serviceData, equipmentData, checkOnly, change); + + MultiResourceAllocationRequest ar = new MultiResourceAllocationRequest(); + ar.stopOnFirstFailure = false; + ar.allocationRequestList = new ArrayList(); + for (ResourceRule rr : resourceRuleList) { + AllocationRequest ar1 = buildAllocationRequest(rr, serviceData, equipmentData, checkOnly, change); + ar.allocationRequestList.add(ar1); + } + for (RangeRule rr : rangeRuleList) { + AllocationRequest ar1 = buildAllocationRequest(rr, serviceData, equipmentData, checkOnly, change); + ar.allocationRequestList.add(ar1); + } + return ar; + } + + private AllocationRequest buildAllocationRequest( + ResourceRule resourceRule, + ServiceData serviceData, + EquipmentData equipmentData, + boolean checkOnly, + boolean change) { + StrUtil.info(log, resourceRule); + + LimitAllocationRequest ar = new LimitAllocationRequest(); + ar.resourceSetId = serviceData.resourceSetId; + ar.resourceUnionId = serviceData.resourceUnionId; + ar.resourceName = resourceRule.resourceName; + ar.assetId = equipmentData.equipmentId; + ar.missingResourceAction = AllocationAction.Succeed_Allocate; + ar.expiredResourceAction = AllocationAction.Succeed_Allocate; + ar.replace = true; + ar.strict = false; + ar.checkLimit = ExpressionEvaluator.evalLong( + change ? resourceRule.hardLimitExpression : resourceRule.softLimitExpression, equipmentData.data); + ar.checkCount = ExpressionEvaluator.evalLong(resourceRule.allocationExpression, serviceData.data); + ar.allocateCount = checkOnly ? 0 : ar.checkCount; + return ar; + } + + private AllocationRequest buildAllocationRequest( + RangeRule rangeRule, + ServiceData serviceData, + EquipmentData equipmentData, + boolean checkOnly, + boolean change) { + StrUtil.info(log, rangeRule); + + RangeAllocationRequest ar = new RangeAllocationRequest(); + ar.resourceSetId = serviceData.resourceSetId; + ar.resourceUnionId = serviceData.resourceUnionId; + ar.resourceName = rangeRule.rangeName; + ar.assetId = equipmentData.equipmentId; + ar.missingResourceAction = AllocationAction.Succeed_Allocate; + ar.expiredResourceAction = AllocationAction.Succeed_Allocate; + ar.replace = true; + ar.check = true; + ar.allocate = !checkOnly; + ar.checkMin = rangeRule.minValue; + ar.checkMax = rangeRule.maxValue; + return ar; + } + + @Override + public ThresholdStatus getThresholdStatus( + ServiceData serviceData, + EquipmentData equipmentData, + LimitAllocationOutcome limitAllocationOutcome) { + ResourceRule rr = resourceRuleDao.getResourceRule(serviceData.serviceModel, serviceData.endPointPosition, + equipmentData.equipmentLevel, limitAllocationOutcome.request.resourceName); + if (rr == null || rr.thresholdList == null || rr.thresholdList.isEmpty()) + return null; + + ThresholdStatus thresholdStatus = null; + long maxThresholdValue = 0; + for (ResourceThreshold th : rr.thresholdList) { + long thresholdValue = ExpressionEvaluator.evalLong(th.expression, equipmentData.data); + + if (thresholdValue > maxThresholdValue) { + maxThresholdValue = thresholdValue; + + if (limitAllocationOutcome.used >= thresholdValue) { + thresholdStatus = new ThresholdStatus(); + thresholdStatus.resourceRule = rr; + thresholdStatus.resourceThreshold = th; + thresholdStatus.limitValue = limitAllocationOutcome.limit; + thresholdStatus.thresholdValue = thresholdValue; + thresholdStatus.used = limitAllocationOutcome.used; + thresholdStatus.lastAdded = limitAllocationOutcome.allocatedCount; + } + } + } + + return thresholdStatus; + } + + public void setResourceRuleDao(ResourceRuleDao resourceRuleDao) { + this.resourceRuleDao = resourceRuleDao; + } + + public void setRangeRuleDao(RangeRuleDao rangeRuleDao) { + this.rangeRuleDao = rangeRuleDao; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/MaxPortSpeedDao.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/MaxPortSpeedDao.java new file mode 100644 index 00000000..a56b7880 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/MaxPortSpeedDao.java @@ -0,0 +1,28 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.rule.dao; + +public interface MaxPortSpeedDao { + + // Returns max speed in kbps + long getMaxPortSpeed(String imageFile, String endPointPosition, String interfaceName); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/MaxPortSpeedDaoImpl.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/MaxPortSpeedDaoImpl.java new file mode 100644 index 00000000..ea0bd771 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/MaxPortSpeedDaoImpl.java @@ -0,0 +1,85 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.rule.dao; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import org.openecomp.sdnc.util.speed.SpeedUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; + +public class MaxPortSpeedDaoImpl implements MaxPortSpeedDao { + + @SuppressWarnings("unused") + private static final Logger log = LoggerFactory.getLogger(MaxPortSpeedDaoImpl.class); + + private final static String GET_SQL = + "SELECT * FROM MAX_PORT_SPEED WHERE image_file_name = ? AND end_point_position = ? AND interface_name = ?"; + + private JdbcTemplate jdbcTemplate; + private long defaultMaxPortSpeed = 5000000; + private SpeedUtil speedUtil; + + @Override + public long getMaxPortSpeed(String imageFile, String endPointPosition, String interfaceName) { + List maxPortSpeedList = + jdbcTemplate.query(GET_SQL, new Object[] { imageFile, endPointPosition, interfaceName }, + new RowMapper() { + + @Override + public MaxPortSpeed mapRow(ResultSet rs, int rowNum) throws SQLException { + MaxPortSpeed mps = new MaxPortSpeed(); + mps.maxSpeed = rs.getLong("max_speed"); + mps.unit = rs.getString("unit"); + return mps; + } + }); + + if (maxPortSpeedList.isEmpty()) + return defaultMaxPortSpeed; + + MaxPortSpeed mps = maxPortSpeedList.get(0); + return speedUtil.convertToKbps(mps.maxSpeed, mps.unit); + } + + private static class MaxPortSpeed { + + public long maxSpeed; + public String unit; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public void setDefaultMaxPortSpeed(long defaultMaxPortSpeed) { + this.defaultMaxPortSpeed = defaultMaxPortSpeed; + } + + public void setSpeedUtil(SpeedUtil speedUtil) { + this.speedUtil = speedUtil; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/MaxServerSpeedDao.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/MaxServerSpeedDao.java new file mode 100644 index 00000000..4bd17f1d --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/MaxServerSpeedDao.java @@ -0,0 +1,28 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.rule.dao; + +public interface MaxServerSpeedDao { + + // Returns max speed in kbps + long getMaxServerSpeed(String serverModel, int evcCount); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/MaxServerSpeedDaoImpl.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/MaxServerSpeedDaoImpl.java new file mode 100644 index 00000000..c3428179 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/MaxServerSpeedDaoImpl.java @@ -0,0 +1,86 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.rule.dao; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import org.openecomp.sdnc.util.speed.SpeedUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; + +public class MaxServerSpeedDaoImpl implements MaxServerSpeedDao { + + @SuppressWarnings("unused") + private static final Logger log = LoggerFactory.getLogger(MaxServerSpeedDaoImpl.class); + + private final static String GET_SQL = + "SELECT * FROM MAX_SERVER_SPEED\n" + + "WHERE (server_model = ? OR server_model = 'ALL') AND evc_count >= ?\n" + + "ORDER BY evc_count"; + + private JdbcTemplate jdbcTemplate; + private long defaultMaxServerSpeed = 1600000; + private SpeedUtil speedUtil; + + @Override + public long getMaxServerSpeed(String serverModel, int evcCount) { + List maxServerSpeedList = + jdbcTemplate.query(GET_SQL, new Object[] { serverModel, evcCount }, new RowMapper() { + + @Override + public MaxServerSpeed mapRow(ResultSet rs, int rowNum) throws SQLException { + MaxServerSpeed mps = new MaxServerSpeed(); + mps.maxSpeed = rs.getLong("max_speed"); + mps.unit = rs.getString("unit"); + return mps; + } + }); + + if (maxServerSpeedList.isEmpty()) + return defaultMaxServerSpeed; + + MaxServerSpeed mps = maxServerSpeedList.get(0); + return speedUtil.convertToKbps(mps.maxSpeed, mps.unit); + } + + private static class MaxServerSpeed { + + public long maxSpeed; + public String unit; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public void setDefaultMaxServerSpeed(long defaultMaxServerSpeed) { + this.defaultMaxServerSpeed = defaultMaxServerSpeed; + } + + public void setSpeedUtil(SpeedUtil speedUtil) { + this.speedUtil = speedUtil; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/ParameterDao.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/ParameterDao.java new file mode 100644 index 00000000..509a034a --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/ParameterDao.java @@ -0,0 +1,27 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.rule.dao; + +public interface ParameterDao { + + String getParameter(String name); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/ParameterDaoImpl.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/ParameterDaoImpl.java new file mode 100644 index 00000000..2cafb280 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/ParameterDaoImpl.java @@ -0,0 +1,57 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.rule.dao; + +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.JdbcTemplate; + +public class ParameterDaoImpl implements ParameterDao { + + private static final Logger log = LoggerFactory.getLogger(ParameterDaoImpl.class); + + private final static String GET_SQL = "SELECT * FROM PARAMETERS WHERE name = ?"; + + private JdbcTemplate jdbcTemplate; + + @Override + public String getParameter(String name) { + List> ll = jdbcTemplate.queryForList(GET_SQL, name); + + if (ll == null || ll.isEmpty()) { + log.info("Parameter: " + name + " not found in DB"); + return null; + } + + String v = (String) ll.get(0).get("value"); + log.info("Parameter from DB: " + name + "='" + v + "'"); + + return v; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/RangeRuleDao.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/RangeRuleDao.java new file mode 100644 index 00000000..798a2303 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/RangeRuleDao.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.rule.dao; + +import java.util.List; + +import org.openecomp.sdnc.ra.equip.data.EquipmentLevel; +import org.openecomp.sdnc.ra.rule.data.RangeRule; + +public interface RangeRuleDao { + + List getRangeRules(String serviceModel, String endPointPosition, EquipmentLevel equipLevel); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/RangeRuleDaoImpl.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/RangeRuleDaoImpl.java new file mode 100644 index 00000000..dec05ece --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/RangeRuleDaoImpl.java @@ -0,0 +1,70 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.rule.dao; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import org.openecomp.sdnc.ra.equip.data.EquipmentLevel; +import org.openecomp.sdnc.ra.rule.data.RangeRule; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; + +public class RangeRuleDaoImpl implements RangeRuleDao { + + @SuppressWarnings("unused") + private static final Logger log = LoggerFactory.getLogger(RangeRuleDaoImpl.class); + + private static final String GET_SQL = + "SELECT * FROM RANGE_RULE WHERE service_model = ? AND end_point_position = ? AND equipment_level = ?"; + + private JdbcTemplate jdbcTemplate; + + @Override + public List getRangeRules(String serviceModel, String endPointPosition, EquipmentLevel equipLevel) { + List rangeRuleList = + jdbcTemplate.query(GET_SQL, new Object[] { serviceModel, endPointPosition, equipLevel.toString() }, + new RowMapper() { + + @Override + public RangeRule mapRow(ResultSet rs, int rowNum) throws SQLException { + RangeRule rl = new RangeRule(); + rl.id = rs.getLong("range_rule_id"); + rl.rangeName = rs.getString("range_name"); + rl.serviceModel = rs.getString("service_model"); + rl.endPointPosition = rs.getString("end_point_position"); + rl.equipmentLevel = rs.getString("equipment_level"); + rl.minValue = rs.getInt("min_value"); + rl.maxValue = rs.getInt("max_value"); + return rl; + } + }); + return rangeRuleList; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/ResourceRuleDao.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/ResourceRuleDao.java new file mode 100644 index 00000000..31ce9e6a --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/ResourceRuleDao.java @@ -0,0 +1,38 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.rule.dao; + +import java.util.List; + +import org.openecomp.sdnc.ra.equip.data.EquipmentLevel; +import org.openecomp.sdnc.ra.rule.data.ResourceRule; + +public interface ResourceRuleDao { + + List getResourceRules(String serviceModel, String endPointPosition, EquipmentLevel equipLevel); + + ResourceRule getResourceRule( + String serviceModel, + String endPointPosition, + EquipmentLevel equipLevel, + String resourceName); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/ResourceRuleDaoImpl.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/ResourceRuleDaoImpl.java new file mode 100644 index 00000000..819a01cd --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/ResourceRuleDaoImpl.java @@ -0,0 +1,117 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.rule.dao; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import org.openecomp.sdnc.ra.equip.data.EquipmentLevel; +import org.openecomp.sdnc.ra.rule.data.ResourceRule; +import org.openecomp.sdnc.ra.rule.data.ResourceThreshold; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; + +public class ResourceRuleDaoImpl implements ResourceRuleDao { + + @SuppressWarnings("unused") + private static final Logger log = LoggerFactory.getLogger(ResourceRuleDaoImpl.class); + + private static final String GET1_SQL = + "SELECT * FROM RESOURCE_RULE WHERE service_model = ? AND end_point_position = ? AND equipment_level = ?"; + private static final String GET2_SQL = + "SELECT * FROM RESOURCE_RULE WHERE service_model = ? AND end_point_position = ? AND equipment_level = ? AND resource_name = ?"; + private static final String THRESHOLD_SQL = "SELECT * FROM RESOURCE_THRESHOLD WHERE resource_rule_id = ?"; + + private JdbcTemplate jdbcTemplate; + ResourceRuleRowMapper resourceRuleRowMapper = new ResourceRuleRowMapper(); + ResourceThresholdRowMapper resourceThresholdRowMapper = new ResourceThresholdRowMapper(); + + @Override + public List getResourceRules( + String serviceModel, + String endPointPosition, + EquipmentLevel equipLevel) { + List resourceRuleList = jdbcTemplate.query(GET1_SQL, + new Object[] { serviceModel, endPointPosition, equipLevel.toString() }, resourceRuleRowMapper); + + for (ResourceRule rr : resourceRuleList) + rr.thresholdList = jdbcTemplate.query(THRESHOLD_SQL, new Object[] { rr.id }, resourceThresholdRowMapper); + + return resourceRuleList; + } + + @Override + public ResourceRule getResourceRule( + String serviceModel, + String endPointPosition, + EquipmentLevel equipLevel, + String resourceName) { + List resourceRuleList = jdbcTemplate.query(GET2_SQL, + new Object[] { serviceModel, endPointPosition, equipLevel.toString(), resourceName }, + resourceRuleRowMapper); + + if (resourceRuleList == null || resourceRuleList.isEmpty()) + return null; + + ResourceRule rr = resourceRuleList.get(0); + rr.thresholdList = jdbcTemplate.query(THRESHOLD_SQL, new Object[] { rr.id }, resourceThresholdRowMapper); + + return rr; + } + + private static class ResourceRuleRowMapper implements RowMapper { + + @Override + public ResourceRule mapRow(ResultSet rs, int rowNum) throws SQLException { + ResourceRule rl = new ResourceRule(); + rl.id = rs.getLong("resource_rule_id"); + rl.resourceName = rs.getString("resource_name"); + rl.serviceModel = rs.getString("service_model"); + rl.endPointPosition = rs.getString("end_point_position"); + rl.serviceExpression = rs.getString("service_expression"); + rl.equipmentLevel = rs.getString("equipment_level"); + rl.equipmentExpression = rs.getString("equipment_expression"); + rl.allocationExpression = rs.getString("allocation_expression"); + rl.softLimitExpression = rs.getString("soft_limit_expression"); + rl.hardLimitExpression = rs.getString("hard_limit_expression"); + return rl; + } + } + + private static class ResourceThresholdRowMapper implements RowMapper { + + @Override + public ResourceThreshold mapRow(ResultSet rs, int rowNum) throws SQLException { + ResourceThreshold th = new ResourceThreshold(); + th.expression = rs.getString("threshold_expression"); + th.message = rs.getString("threshold_message"); + return th; + } + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/VpeLockDao.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/VpeLockDao.java new file mode 100644 index 00000000..eb41792d --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/VpeLockDao.java @@ -0,0 +1,27 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.rule.dao; + +public interface VpeLockDao { + + String getVpeLock(String vpeName); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/VpeLockDaoImpl.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/VpeLockDaoImpl.java new file mode 100644 index 00000000..eb6cef3b --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/VpeLockDaoImpl.java @@ -0,0 +1,48 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.rule.dao; + +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.JdbcTemplate; + +public class VpeLockDaoImpl implements VpeLockDao { + + @SuppressWarnings("unused") + private static final Logger log = LoggerFactory.getLogger(VpeLockDaoImpl.class); + + private final static String GET_SQL = "SELECT vpn_lock FROM VPE_LOCK WHERE vpe_name = ?"; + + private JdbcTemplate jdbcTemplate; + + @Override + public String getVpeLock(String vpeName) { + List ll = jdbcTemplate.queryForList(GET_SQL, String.class, vpeName); + return ll != null && !ll.isEmpty() ? ll.get(0) : null; + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/data/RangeRule.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/data/RangeRule.java new file mode 100644 index 00000000..ed76f6b1 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/data/RangeRule.java @@ -0,0 +1,33 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.rule.data; + +public class RangeRule { + + public long id; + public String rangeName; + public String serviceModel; + public String endPointPosition; + public String equipmentLevel; + public int minValue; + public int maxValue; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/data/ResourceRule.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/data/ResourceRule.java new file mode 100644 index 00000000..c4d55f92 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/data/ResourceRule.java @@ -0,0 +1,39 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.rule.data; + +import java.util.List; + +public class ResourceRule { + + public long id; + public String resourceName; + public String serviceModel; + public String endPointPosition; + public String serviceExpression; + public String equipmentLevel; + public String equipmentExpression; + public String allocationExpression; + public String softLimitExpression; + public String hardLimitExpression; + public List thresholdList; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/data/ResourceThreshold.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/data/ResourceThreshold.java new file mode 100644 index 00000000..7be4067e --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/data/ResourceThreshold.java @@ -0,0 +1,28 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.rule.data; + +public class ResourceThreshold { + + public String expression; + public String message; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/data/ThresholdStatus.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/data/ThresholdStatus.java new file mode 100644 index 00000000..5f772ef1 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/data/ThresholdStatus.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.rule.data; + +public class ThresholdStatus { + + public ResourceRule resourceRule; + public ResourceThreshold resourceThreshold; + public long limitValue; + public long thresholdValue; + public long used; + public long lastAdded; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/service/dao/ServiceResourceDao.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/service/dao/ServiceResourceDao.java new file mode 100644 index 00000000..811118cb --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/service/dao/ServiceResourceDao.java @@ -0,0 +1,38 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.service.dao; + +import org.openecomp.sdnc.ra.service.data.ServiceResource; +import org.openecomp.sdnc.ra.service.data.ServiceStatus; + +public interface ServiceResourceDao { + + ServiceResource getServiceResource(String serviceInstanceId, ServiceStatus serviceStatus); + + void addServiceResource(ServiceResource serviceResource); + + void updateServiceResource(ServiceResource serviceResource); + + void deleteServiceResource(String serviceInstanceId, ServiceStatus serviceStatus); + + void updateServiceStatus(String serviceInstanceId, ServiceStatus serviceStatus, ServiceStatus newServiceStatus); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/service/dao/ServiceResourceDaoImpl.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/service/dao/ServiceResourceDaoImpl.java new file mode 100644 index 00000000..6432e80d --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/service/dao/ServiceResourceDaoImpl.java @@ -0,0 +1,110 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.service.dao; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import org.openecomp.sdnc.ra.service.data.ServiceResource; +import org.openecomp.sdnc.ra.service.data.ServiceStatus; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; + +public class ServiceResourceDaoImpl implements ServiceResourceDao { + + @SuppressWarnings("unused") + private static final Logger log = LoggerFactory.getLogger(ServiceResourceDaoImpl.class); + + private static final String GET_SQL = + "SELECT * FROM SERVICE_RESOURCE WHERE service_instance_id = ? AND service_status = ?"; + + private static final String ADD_SQL = "INSERT INTO SERVICE_RESOURCE (\n" + + " service_instance_id, service_status, service_change_number, resource_set_id, resource_union_id)\n" + + "VALUES (?, ?, ?, ?, ?)"; + + private static final String UPDATE_SQL = + "UPDATE SERVICE_RESOURCE SET service_change_number = ?, resource_set_id = ?\n" + + "WHERE service_instance_id = ? AND service_status = ?"; + + private static final String DELETE_SQL = + "DELETE FROM SERVICE_RESOURCE WHERE service_instance_id = ? AND service_status = ?"; + + private static final String UPDATE_STATUS_SQL = + "UPDATE SERVICE_RESOURCE SET service_status = ? WHERE service_instance_id = ? AND service_status = ?"; + + private JdbcTemplate jdbcTemplate; + + @Override + public ServiceResource getServiceResource(final String serviceInstanceId, final ServiceStatus serviceStatus) { + List serviceResourceList = + jdbcTemplate.query(GET_SQL, new Object[] { serviceInstanceId, serviceStatus.toString() }, + new RowMapper() { + + @Override + public ServiceResource mapRow(ResultSet rs, int rowNum) throws SQLException { + ServiceResource sr = new ServiceResource(); + sr.id = rs.getLong("service_resource_id"); + sr.serviceInstanceId = serviceInstanceId; + sr.serviceStatus = serviceStatus; + sr.serviceChangeNumber = rs.getInt("service_change_number"); + sr.resourceSetId = rs.getString("resource_set_id"); + sr.resourceUnionId = rs.getString("resource_union_id"); + return sr; + } + }); + if (serviceResourceList.isEmpty()) + return null; + return serviceResourceList.get(0); + } + + @Override + public void addServiceResource(ServiceResource serviceResource) { + jdbcTemplate.update(ADD_SQL, serviceResource.serviceInstanceId, serviceResource.serviceStatus.toString(), + serviceResource.serviceChangeNumber, serviceResource.resourceSetId, serviceResource.resourceUnionId); + } + + @Override + public void updateServiceResource(ServiceResource serviceResource) { + jdbcTemplate.update(UPDATE_SQL, serviceResource.serviceChangeNumber, serviceResource.resourceSetId, + serviceResource.serviceInstanceId, serviceResource.serviceStatus.toString()); + } + + @Override + public void deleteServiceResource(String serviceInstanceId, ServiceStatus serviceStatus) { + jdbcTemplate.update(DELETE_SQL, serviceInstanceId, serviceStatus.toString()); + } + + @Override + public void updateServiceStatus( + String serviceInstanceId, + ServiceStatus serviceStatus, + ServiceStatus newServiceStatus) { + jdbcTemplate.update(UPDATE_STATUS_SQL, newServiceStatus.toString(), serviceInstanceId, serviceStatus.toString()); + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/service/data/ServiceResource.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/service/data/ServiceResource.java new file mode 100644 index 00000000..65d4488e --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/service/data/ServiceResource.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.service.data; + +public class ServiceResource { + + public long id; + public String serviceInstanceId; + public ServiceStatus serviceStatus; + public int serviceChangeNumber; + public String resourceSetId; + public String resourceUnionId; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/service/data/ServiceStatus.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/service/data/ServiceStatus.java new file mode 100644 index 00000000..32f473d3 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/service/data/ServiceStatus.java @@ -0,0 +1,27 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.ra.service.data; + +public enum ServiceStatus { + + Active, Pending +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/comp/AllocationFunction.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/comp/AllocationFunction.java new file mode 100644 index 00000000..3a934091 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/comp/AllocationFunction.java @@ -0,0 +1,330 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.comp; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; + +import org.openecomp.sdnc.lock.comp.LockHelper; +import org.openecomp.sdnc.lock.comp.ResourceLockedException; +import org.openecomp.sdnc.lock.comp.SynchronizedFunction; +import org.openecomp.sdnc.rm.dao.ResourceDao; +import org.openecomp.sdnc.rm.data.AllocationOutcome; +import org.openecomp.sdnc.rm.data.AllocationRequest; +import org.openecomp.sdnc.rm.data.AllocationStatus; +import org.openecomp.sdnc.rm.data.LabelAllocationOutcome; +import org.openecomp.sdnc.rm.data.LabelAllocationRequest; +import org.openecomp.sdnc.rm.data.LabelResource; +import org.openecomp.sdnc.rm.data.LimitAllocationOutcome; +import org.openecomp.sdnc.rm.data.LimitAllocationRequest; +import org.openecomp.sdnc.rm.data.LimitResource; +import org.openecomp.sdnc.rm.data.MultiAssetAllocationOutcome; +import org.openecomp.sdnc.rm.data.MultiAssetAllocationRequest; +import org.openecomp.sdnc.rm.data.MultiResourceAllocationOutcome; +import org.openecomp.sdnc.rm.data.MultiResourceAllocationRequest; +import org.openecomp.sdnc.rm.data.RangeAllocationOutcome; +import org.openecomp.sdnc.rm.data.RangeAllocationRequest; +import org.openecomp.sdnc.rm.data.RangeResource; +import org.openecomp.sdnc.rm.data.Resource; +import org.openecomp.sdnc.rm.data.ResourceKey; +import org.openecomp.sdnc.rm.data.ResourceType; +import org.openecomp.sdnc.rm.util.LabelUtil; +import org.openecomp.sdnc.rm.util.LimitUtil; +import org.openecomp.sdnc.rm.util.RangeUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +class AllocationFunction extends SynchronizedFunction { + + @SuppressWarnings("unused") + private static final Logger log = LoggerFactory.getLogger(AllocationFunction.class); + + private ResourceDao resourceDao; + + private String applicationId; + private AllocationRequest request; + private AllocationOutcome outcome; + + private List updateList = new ArrayList(); + + public AllocationFunction(LockHelper lockHelper, ResourceDao resourceDao, String applicationId, + AllocationRequest request, int lockTimeout) { + super(lockHelper, getLockNames(request), lockTimeout); + this.applicationId = applicationId; + this.resourceDao = resourceDao; + this.request = request; + } + + private static Collection getLockNames(AllocationRequest request) { + Set lockResourceNames = new HashSet(); + addLockNames(lockResourceNames, request); + return lockResourceNames; + } + + private static void addLockNames(Set lockResourceNames, AllocationRequest request) { + if (request instanceof MultiAssetAllocationRequest) { + MultiAssetAllocationRequest req = (MultiAssetAllocationRequest) request; + if (req.assetIdList != null) + lockResourceNames.addAll(req.assetIdList); + } else if (request instanceof MultiResourceAllocationRequest) { + MultiResourceAllocationRequest req = (MultiResourceAllocationRequest) request; + if (req.allocationRequestList != null) + for (AllocationRequest request1 : req.allocationRequestList) + addLockNames(lockResourceNames, request1); + } else if (request.assetId != null) + lockResourceNames.add(request.assetId); + } + + @Override + public void _exec() throws ResourceLockedException { + outcome = allocate(request); + if (outcome.status == AllocationStatus.Success) + for (Resource r : updateList) + resourceDao.saveResource(r); + } + + private AllocationOutcome allocate(AllocationRequest allocationRequest) throws ResourceLockedException { + if (allocationRequest instanceof MultiAssetAllocationRequest) + return allocateMultiAsset((MultiAssetAllocationRequest) allocationRequest); + if (allocationRequest instanceof MultiResourceAllocationRequest) + return allocateMultiResource((MultiResourceAllocationRequest) allocationRequest); + if (allocationRequest instanceof LimitAllocationRequest) + return allocateLimit((LimitAllocationRequest) allocationRequest); + if (allocationRequest instanceof LabelAllocationRequest) + return allocateLabel((LabelAllocationRequest) allocationRequest); + if (allocationRequest instanceof RangeAllocationRequest) + return allocateRange((RangeAllocationRequest) allocationRequest); + return null; + } + + private MultiAssetAllocationOutcome allocateMultiAsset(MultiAssetAllocationRequest req) { + // TODO Auto-generated method stub + return null; + } + + private MultiResourceAllocationOutcome allocateMultiResource(MultiResourceAllocationRequest req) { + MultiResourceAllocationOutcome out = new MultiResourceAllocationOutcome(); + out.request = req; + out.allocationOutcomeList = new ArrayList(); + out.status = AllocationStatus.Success; + + if (req.allocationRequestList != null) + for (AllocationRequest req1 : req.allocationRequestList) { + AllocationOutcome out1 = allocate(req1); + out.allocationOutcomeList.add(out1); + if (out1.status != AllocationStatus.Success) + out.status = AllocationStatus.Failure; + } + + return out; + } + + private LimitAllocationOutcome allocateLimit(LimitAllocationRequest req) { + LimitAllocationOutcome out = new LimitAllocationOutcome(); + out.request = req; + + Resource r = resourceDao.getResource(req.assetId, req.resourceName); + if (r == null) { + r = new LimitResource(); + r.resourceKey = new ResourceKey(); + r.resourceKey.assetId = req.assetId; + r.resourceKey.resourceName = req.resourceName; + r.resourceType = ResourceType.Limit; + } else { + if (r.resourceType != ResourceType.Limit) { + out.status = AllocationStatus.ResourceNotFound; + return out; + } + LimitUtil.recalculate((LimitResource) r); + } + + LimitResource l = (LimitResource) r; + if (LimitUtil.checkLimit(l, req)) { + out.status = AllocationStatus.Success; + if (req.allocateCount > 0) { + out.allocatedCount = LimitUtil.allocateLimit(l, req, applicationId); + updateList.add(l); + } + } else + out.status = AllocationStatus.Failure; + + out.used = l.used; + out.limit = req.checkLimit; + + return out; + } + + private LabelAllocationOutcome allocateLabel(LabelAllocationRequest req) { + LabelAllocationOutcome out = new LabelAllocationOutcome(); + + out.request = req; + + Resource r = resourceDao.getResource(req.assetId, req.resourceName); + if (r == null) { + r = new LabelResource(); + r.resourceKey = new ResourceKey(); + r.resourceKey.assetId = req.assetId; + r.resourceKey.resourceName = req.resourceName; + r.resourceType = ResourceType.Label; + } else { + if (r.resourceType != ResourceType.Label) { + out.status = AllocationStatus.ResourceNotFound; + return out; + } + LabelUtil.recalculate((LabelResource) r); + } + + LabelResource l = (LabelResource) r; + if (LabelUtil.checkLabel(l, req)) { + out.status = AllocationStatus.Success; + out.currentLabel = l.label; + if (req.allocate) { + out.allocatedLabel = LabelUtil.allocateLabel(l, req, applicationId); + updateList.add(l); + } + } else + out.status = AllocationStatus.Failure; + + return out; + } + + private RangeAllocationOutcome allocateRange(RangeAllocationRequest req) { + RangeAllocationOutcome out = new RangeAllocationOutcome(); + + out.request = req; + + Resource r = resourceDao.getResource(req.assetId, req.resourceName); + if (r == null) { + r = new RangeResource(); + r.resourceKey = new ResourceKey(); + r.resourceKey.assetId = req.assetId; + r.resourceKey.resourceName = req.resourceName; + r.resourceType = ResourceType.Range; + } else { + if (r.resourceType != ResourceType.Range) { + out.status = AllocationStatus.ResourceNotFound; + return out; + } + RangeUtil.recalculate((RangeResource) r); + } + + RangeResource rr = (RangeResource) r; + SortedSet foundNumbers = null; + if (!req.check) { + out.status = AllocationStatus.Success; + foundNumbers = req.requestedNumbers; + } else { + if (req.requestedNumbers != null && req.requestedNumbers.size() > 0) { + foundNumbers = req.requestedNumbers; + out.status = AllocationStatus.Success; + for (int n : foundNumbers) + if (!RangeUtil.checkRange(rr, req, n)) { + out.status = AllocationStatus.Failure; + break; + } + } else { + foundNumbers = new TreeSet(); + int foundCount = 0; + + // First try to reuse the numbers already taken by the same resource union + SortedSet uu = RangeUtil.getUsed(rr, req.resourceUnionId); + if (uu != null && !uu.isEmpty()) { + if (uu.size() >= req.requestedCount) { + // Just take the first req.requestedCount numbers from uu + Iterator i = uu.iterator(); + while (foundCount < req.requestedCount) { + foundNumbers.add(i.next()); + foundCount++; + } + } else { + // Additional numbers are requested. Try to find them starting from + // the minimum we have in uu (the first element) towards the min + // parameter, and then starting from the maximum in uu (the last + // element) towards the max parameter. + // NOTE: In case of request for sequential numbers, the parameters + // alignBlockSize and alignModulus are ignored. It would be harder + // to take them into account, and currently it is not needed. + + int uumin = uu.first() - 1; + int uumax = uu.last() + 1; + foundNumbers.addAll(uu); + foundCount = uu.size(); + for (int n = uumin; foundCount < req.requestedCount && n >= req.checkMin; n--) { + if (RangeUtil.checkRange(rr, req, n)) { + foundNumbers.add(n); + foundCount++; + } else if (req.sequential) + break; + } + for (int n = uumax; foundCount < req.requestedCount && n <= req.checkMax; n++) { + if (RangeUtil.checkRange(rr, req, n)) { + foundNumbers.add(n); + foundCount++; + } else if (req.sequential) + break; + } + + // If we could not find enough numbers trying to reuse currently + // allocated, reset foundNumbers and foundCount, continue with + // the normal allocation of new numbers. + if (foundCount < req.requestedCount) { + foundNumbers = new TreeSet(); + foundCount = 0; + } + } + } + + for (int n = req.checkMin; foundCount < req.requestedCount && n <= req.checkMax; n++) + if (RangeUtil.checkRange(rr, req, n)) { + foundNumbers.add(n); + foundCount++; + } else if (req.sequential) + foundCount = 0; + + out.status = foundCount == req.requestedCount ? AllocationStatus.Success : AllocationStatus.Failure; + } + } + + if (out.status == AllocationStatus.Success) { + out.allocated = foundNumbers; + if (req.allocate) { + RangeUtil.allocateRange(rr, out.allocated, req, applicationId); + updateList.add(rr); + } + } else + out.allocated = new TreeSet(); + + out.used = rr.used; + + return out; + } + + public AllocationOutcome getAllocationOutcome() { + return outcome; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/comp/ReleaseFunction.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/comp/ReleaseFunction.java new file mode 100644 index 00000000..f546954f --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/comp/ReleaseFunction.java @@ -0,0 +1,88 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.comp; + +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import org.openecomp.sdnc.lock.comp.LockHelper; +import org.openecomp.sdnc.lock.comp.ResourceLockedException; +import org.openecomp.sdnc.lock.comp.SynchronizedFunction; +import org.openecomp.sdnc.rm.dao.ResourceDao; +import org.openecomp.sdnc.rm.data.AllocationItem; +import org.openecomp.sdnc.rm.data.Resource; +import org.openecomp.sdnc.rm.util.ResourceUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +class ReleaseFunction extends SynchronizedFunction { + + @SuppressWarnings("unused") + private static final Logger log = LoggerFactory.getLogger(ReleaseFunction.class); + + private ResourceDao resourceDao; + + private String resourceSetId, resourceUnionId; + + public ReleaseFunction(LockHelper lockHelper, ResourceDao resourceDao, String resourceSetId, + String resourceUnionId, Collection lockNames, int lockTimeout) { + super(lockHelper, lockNames, lockTimeout); + this.resourceDao = resourceDao; + this.resourceSetId = resourceSetId; + this.resourceUnionId = resourceUnionId; + } + + @Override + public void _exec() throws ResourceLockedException { + List resourceList = + resourceSetId != null + ? resourceDao.getResourceSet(resourceSetId) : resourceDao.getResourceUnion(resourceUnionId); + for (Resource r : resourceList) { + boolean updated = false; + if (r.allocationItems != null) { + Iterator i = r.allocationItems.iterator(); + while (i.hasNext()) { + AllocationItem ai = i.next(); + if (resourceSetId != null) { + if (resourceSetId.equals(ai.resourceSetId)) { + i.remove(); + updated = true; + } + + } else if (resourceUnionId != null) { + + if (resourceUnionId.equals(ai.resourceUnionId)) { + i.remove(); + updated = true; + } + + } + } + } + if (updated) { + ResourceUtil.recalculate(r); + resourceDao.saveResource(r); + } + } + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/comp/ResourceLoader.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/comp/ResourceLoader.java new file mode 100644 index 00000000..aea0b0a3 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/comp/ResourceLoader.java @@ -0,0 +1,39 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.comp; + +import java.util.Collection; + +import org.openecomp.sdnc.rm.data.Resource; + +public interface ResourceLoader { + + void loadResource(String applicationId, Resource resource, boolean force); + + void loadResources(String applicationId, Collection resourceList, boolean force); + + void loadResourcesForAsset(String applicationId, String assetId, Collection resourceList, boolean force); + + void deleteResource(String applicationId, String assetId, String resourceName); + + void deleteResourcesForAsset(String applicationId, String assetId); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/comp/ResourceManager.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/comp/ResourceManager.java new file mode 100644 index 00000000..7a3ce034 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/comp/ResourceManager.java @@ -0,0 +1,41 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.comp; + +import java.util.List; + +import org.openecomp.sdnc.rm.data.AllocationOutcome; +import org.openecomp.sdnc.rm.data.AllocationRequest; +import org.openecomp.sdnc.rm.data.Resource; + +public interface ResourceManager { + + Resource getResource(String resourceName, String assetId); + + List getResourceUnion(String resourceUnionId); + + AllocationOutcome allocateResources(AllocationRequest allocationRequest); + + void releaseResourceSet(String resourceSetId); + + void releaseResourceUnion(String resourceUnionId); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/comp/ResourceManagerImpl.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/comp/ResourceManagerImpl.java new file mode 100644 index 00000000..b9d5a099 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/comp/ResourceManagerImpl.java @@ -0,0 +1,128 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.comp; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.openecomp.sdnc.lock.comp.LockHelper; +import org.openecomp.sdnc.rm.dao.ResourceDao; +import org.openecomp.sdnc.rm.data.AllocationOutcome; +import org.openecomp.sdnc.rm.data.AllocationRequest; +import org.openecomp.sdnc.rm.data.Resource; +import org.openecomp.sdnc.rm.util.ResourceUtil; +import org.openecomp.sdnc.util.str.StrUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ResourceManagerImpl implements ResourceManager { + + private static final Logger log = LoggerFactory.getLogger(ResourceManagerImpl.class); + + private LockHelper lockHelper; + private ResourceDao resourceDao; + + private String applicationId; + private int lockTimeout = 10 * 60; // Default 10 min + + public ResourceManagerImpl() { + log.info("ResourceManager created."); + } + + @Override + public Resource getResource(String resourceName, String assetId) { + Resource r = resourceDao.getResource(assetId, resourceName); + ResourceUtil.recalculate(r); + return r; + } + + @Override + public List getResourceUnion(String resourceUnionId) { + List rlist = resourceDao.getResourceUnion(resourceUnionId); + for (Resource r : rlist) + ResourceUtil.recalculate(r); + return rlist; + } + + @Override + public AllocationOutcome allocateResources(AllocationRequest allocationRequest) { + if (allocationRequest == null) + throw new IllegalArgumentException("allocateResources called with null argument"); + + AllocationFunction allocationFunction = + new AllocationFunction(lockHelper, resourceDao, applicationId, allocationRequest, lockTimeout); + allocationFunction.exec(); + AllocationOutcome allocationOutcome = allocationFunction.getAllocationOutcome(); + + StrUtil.info(log, allocationOutcome); + + return allocationOutcome; + } + + @Override + public void releaseResourceSet(String resourceSetId) { + List resourceList = resourceDao.getResourceSet(resourceSetId); + if (resourceList == null || resourceList.isEmpty()) + return; + + Set lockNames = getLockNames(resourceList); + ReleaseFunction releaseFunction = + new ReleaseFunction(lockHelper, resourceDao, resourceSetId, null, lockNames, lockTimeout); + releaseFunction.exec(); + } + + @Override + public void releaseResourceUnion(String resourceUnionId) { + List resourceList = resourceDao.getResourceUnion(resourceUnionId); + if (resourceList == null || resourceList.isEmpty()) + return; + + Set lockNames = getLockNames(resourceList); + ReleaseFunction releaseFunction = + new ReleaseFunction(lockHelper, resourceDao, null, resourceUnionId, lockNames, lockTimeout); + releaseFunction.exec(); + } + + private Set getLockNames(List resourceList) { + Set lockNames = new HashSet(); + for (Resource r : resourceList) + lockNames.add(r.resourceKey.assetId); + return lockNames; + } + + public void setResourceDao(ResourceDao resourceDao) { + this.resourceDao = resourceDao; + } + + public void setLockTimeout(int lockTimeout) { + this.lockTimeout = lockTimeout; + } + + public void setApplicationId(String applicationId) { + this.applicationId = applicationId; + } + + public void setLockHelper(LockHelper lockHelper) { + this.lockHelper = lockHelper; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/ResourceDao.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/ResourceDao.java new file mode 100644 index 00000000..f499801c --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/ResourceDao.java @@ -0,0 +1,39 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.dao; + +import java.util.List; + +import org.openecomp.sdnc.rm.data.Resource; + +public interface ResourceDao { + + Resource getResource(String assetId, String resourceName); + + void saveResource(Resource resource); + + void deleteResource(String assetId, String resourceName); + + List getResourceSet(String resourceSetId); + + List getResourceUnion(String resourceUnionId); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/AllocationItem.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/AllocationItem.java new file mode 100644 index 00000000..eb5f3988 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/AllocationItem.java @@ -0,0 +1,37 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.dao.jdbc; + +import java.util.Date; + +public class AllocationItem { + + public long id; + public long resourceId; + public String applicationId; + public String resourceSetId, resourceUnionId; + public String resourceShareGroupList; + public long ltUsed; + public String llLabel; + public String rrUsed; + public Date allocationTime; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/AllocationItemJdbcDao.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/AllocationItemJdbcDao.java new file mode 100644 index 00000000..30f9d26a --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/AllocationItemJdbcDao.java @@ -0,0 +1,35 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.dao.jdbc; + +import java.util.List; + +public interface AllocationItemJdbcDao { + + void add(AllocationItem ai); + + List getAllocationItems(long resourceId); + + void update(AllocationItem ai); + + void delete(long id); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/AllocationItemJdbcDaoImpl.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/AllocationItemJdbcDaoImpl.java new file mode 100644 index 00000000..1d88261c --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/AllocationItemJdbcDaoImpl.java @@ -0,0 +1,126 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.dao.jdbc; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.Collections; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.PreparedStatementCreator; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; + +public class AllocationItemJdbcDaoImpl implements AllocationItemJdbcDao { + + @SuppressWarnings("unused") + private static final Logger log = LoggerFactory.getLogger(ResourceJdbcDaoImpl.class); + + private static final String INSERT_SQL = "INSERT INTO ALLOCATION_ITEM (\n" + + " resource_id, application_id, resource_set_id, resource_union_id, resource_share_group_list,\n" + + " lt_used, ll_label, rr_used, allocation_time)\nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; + + private static final String UPDATE_SQL = "UPDATE ALLOCATION_ITEM SET\n" + + " resource_share_group_list = ?, lt_used = ?, ll_label = ?, rr_used = ?, allocation_time = ?\n" + + "WHERE allocation_item_id = ?"; + + private static final String DELETE_SQL = "DELETE FROM ALLOCATION_ITEM WHERE allocation_item_id = ?"; + + private static final String GET_SQL = "SELECT * FROM ALLOCATION_ITEM WHERE resource_id = ?"; + + private JdbcTemplate jdbcTemplate; + private AllocationItemRowMapper allocationItemRowMapper = new AllocationItemRowMapper(); + + @Override + public void add(final AllocationItem ai) { + PreparedStatementCreator psc = new PreparedStatementCreator() { + + @Override + public PreparedStatement createPreparedStatement(Connection dbc) throws SQLException { + PreparedStatement ps = dbc.prepareStatement(INSERT_SQL, new String[] { "allocation_item_id" }); + ps.setLong(1, ai.resourceId); + ps.setString(2, ai.applicationId); + ps.setString(3, ai.resourceSetId); + ps.setString(4, ai.resourceUnionId); + ps.setString(5, ai.resourceShareGroupList); + ps.setLong(6, ai.ltUsed); + ps.setString(7, ai.llLabel); + ps.setString(8, ai.rrUsed); + ps.setTimestamp(9, new Timestamp(ai.allocationTime.getTime())); + return ps; + } + }; + KeyHolder keyHolder = new GeneratedKeyHolder(); + jdbcTemplate.update(psc, keyHolder); + ai.id = keyHolder.getKey().longValue(); + } + + @Override + public void update(AllocationItem ai) { + Long ltUsed = ai.ltUsed <= 0 ? null : ai.ltUsed; + jdbcTemplate.update(UPDATE_SQL, ai.resourceShareGroupList, ltUsed, ai.llLabel, ai.rrUsed, ai.allocationTime, + ai.id); + } + + @Override + public void delete(long id) { + jdbcTemplate.update(DELETE_SQL, id); + } + + @Override + public List getAllocationItems(long resourceId) { + if (resourceId <= 0) + return Collections.emptyList(); + + return jdbcTemplate.query(GET_SQL, new Object[] { resourceId }, allocationItemRowMapper); + } + + private static class AllocationItemRowMapper implements RowMapper { + + @Override + public AllocationItem mapRow(ResultSet rs, int n) throws SQLException { + AllocationItem ai = new AllocationItem(); + ai.id = rs.getLong("allocation_item_id"); + ai.resourceId = rs.getLong("resource_id"); + ai.applicationId = rs.getString("application_id"); + ai.resourceSetId = rs.getString("resource_set_id"); + ai.resourceUnionId = rs.getString("resource_union_id"); + ai.resourceShareGroupList = rs.getString("resource_share_group_list"); + ai.ltUsed = rs.getLong("lt_used"); + ai.llLabel = rs.getString("ll_label"); + ai.rrUsed = rs.getString("rr_used"); + ai.allocationTime = rs.getTimestamp("allocation_time"); + return ai; + } + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/Resource.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/Resource.java new file mode 100644 index 00000000..ca66964c --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/Resource.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.dao.jdbc; + +public class Resource { + + public long id; + public String assetId, name, type; + public long ltUsed; + public String llLabel; + public int llReferenceCount; + public String rrUsed; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceDaoImpl.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceDaoImpl.java new file mode 100644 index 00000000..32c8f4d7 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceDaoImpl.java @@ -0,0 +1,370 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.dao.jdbc; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; + +import org.openecomp.sdnc.rm.dao.ResourceDao; +import org.openecomp.sdnc.rm.data.LabelAllocationItem; +import org.openecomp.sdnc.rm.data.LabelResource; +import org.openecomp.sdnc.rm.data.LimitAllocationItem; +import org.openecomp.sdnc.rm.data.LimitResource; +import org.openecomp.sdnc.rm.data.RangeAllocationItem; +import org.openecomp.sdnc.rm.data.RangeResource; +import org.openecomp.sdnc.rm.data.ResourceKey; +import org.openecomp.sdnc.rm.data.ResourceType; +import org.openecomp.sdnc.util.str.StrUtil; + +public class ResourceDaoImpl implements ResourceDao { + + private ResourceJdbcDao resourceJdbcDao; + private ResourceLoadJdbcDao resourceLoadJdbcDao; + private AllocationItemJdbcDao allocationItemJdbcDao; + + @Override + public org.openecomp.sdnc.rm.data.Resource getResource(String assetId, String resourceName) { + Resource rEntity = resourceJdbcDao.getResource(assetId, resourceName); + org.openecomp.sdnc.rm.data.Resource r = createResource(rEntity); + + if (r != null) { + List aiEntityList = allocationItemJdbcDao.getAllocationItems(rEntity.id); + r.allocationItems = new ArrayList(); + for (AllocationItem aiEntity : aiEntityList) { + org.openecomp.sdnc.rm.data.AllocationItem ai = createAllocationItem(r, aiEntity); + r.allocationItems.add(ai); + } + + List rlEntityList = resourceLoadJdbcDao.getResourceLoads(rEntity.id); + r.resourceLoadList = new ArrayList(); + for (ResourceLoad rlEntity : rlEntityList) { + org.openecomp.sdnc.rm.data.ResourceLoad rl = createResourceLoad(r, rlEntity); + r.resourceLoadList.add(rl); + } + } + + return r; + } + + @Override + public void saveResource(org.openecomp.sdnc.rm.data.Resource resource) { + if (resource == null) + return; + + org.openecomp.sdnc.rm.dao.jdbc.Resource resourceEntity = + resourceJdbcDao.getResource(resource.resourceKey.assetId, resource.resourceKey.resourceName); + if (resourceEntity == null) { + resourceEntity = createResourceEntity(resource); + resourceJdbcDao.add(resourceEntity); + if (resource.allocationItems != null) + for (org.openecomp.sdnc.rm.data.AllocationItem ai : resource.allocationItems) { + AllocationItem aiEntity = createAllocationItemEntity(resourceEntity.id, ai); + allocationItemJdbcDao.add(aiEntity); + } + if (resource.resourceLoadList != null) + for (org.openecomp.sdnc.rm.data.ResourceLoad rl : resource.resourceLoadList) { + ResourceLoad rlEntity = createResourceLoadEntity(resourceEntity.id, rl); + resourceLoadJdbcDao.add(rlEntity); + } + } else { + updateResourceEntity(resourceEntity, resource); + resourceJdbcDao.update(resourceEntity); + + List oldAiEntityList = allocationItemJdbcDao.getAllocationItems(resourceEntity.id); + if (resource.allocationItems != null) + for (org.openecomp.sdnc.rm.data.AllocationItem newai : resource.allocationItems) { + AllocationItem foundAiEntity = null; + for (AllocationItem oldAiEntity : oldAiEntityList) + if (oldAiEntity.resourceSetId.equals(newai.resourceSetId)) { + foundAiEntity = oldAiEntity; + break; + } + if (foundAiEntity != null) { + updateAllocationItemEntity(foundAiEntity, newai); + allocationItemJdbcDao.update(foundAiEntity); + } else { + AllocationItem newAiEntity = createAllocationItemEntity(resourceEntity.id, newai); + allocationItemJdbcDao.add(newAiEntity); + } + } + for (AllocationItem oldAiEntity : oldAiEntityList) { + boolean found = false; + if (resource.allocationItems != null) + for (org.openecomp.sdnc.rm.data.AllocationItem newai : resource.allocationItems) + if (oldAiEntity.resourceSetId.equals(newai.resourceSetId)) { + found = true; + break; + } + if (!found) + allocationItemJdbcDao.delete(oldAiEntity.id); + } + + List oldRlEntityList = resourceLoadJdbcDao.getResourceLoads(resourceEntity.id); + if (resource.resourceLoadList != null) + for (org.openecomp.sdnc.rm.data.ResourceLoad newrl : resource.resourceLoadList) { + ResourceLoad foundRlEntity = null; + for (ResourceLoad oldRlEntity : oldRlEntityList) + if (oldRlEntity.applicationId.equals(newrl.applicationId)) { + foundRlEntity = oldRlEntity; + break; + } + if (foundRlEntity != null) { + updateResourceLoadEntity(foundRlEntity, newrl); + resourceLoadJdbcDao.update(foundRlEntity); + } else { + ResourceLoad newRlEntity = createResourceLoadEntity(resourceEntity.id, newrl); + resourceLoadJdbcDao.add(newRlEntity); + } + } + for (ResourceLoad oldRlEntity : oldRlEntityList) { + boolean found = false; + if (resource.resourceLoadList != null) + for (org.openecomp.sdnc.rm.data.ResourceLoad newrl : resource.resourceLoadList) + if (oldRlEntity.applicationId.equals(newrl.applicationId)) { + found = true; + break; + } + if (!found) + resourceLoadJdbcDao.delete(oldRlEntity.id); + } + } + } + + @Override + public void deleteResource(String assetId, String resourceName) { + org.openecomp.sdnc.rm.dao.jdbc.Resource resourceEntity = resourceJdbcDao.getResource(assetId, resourceName); + if (resourceEntity != null) + resourceJdbcDao.delete(resourceEntity.id); + } + + @Override + public List getResourceSet(String resourceSetId) { + List rEntityList = resourceJdbcDao.getResourceSet(resourceSetId); + List rlist = new ArrayList(); + for (Resource rEntity : rEntityList) { + org.openecomp.sdnc.rm.data.Resource r = createResource(rEntity); + rlist.add(r); + + List aiEntityList = allocationItemJdbcDao.getAllocationItems(rEntity.id); + r.allocationItems = new ArrayList(); + for (AllocationItem aiEntity : aiEntityList) { + org.openecomp.sdnc.rm.data.AllocationItem ai = createAllocationItem(r, aiEntity); + r.allocationItems.add(ai); + } + + List rlEntityList = resourceLoadJdbcDao.getResourceLoads(rEntity.id); + r.resourceLoadList = new ArrayList(); + for (ResourceLoad rlEntity : rlEntityList) { + org.openecomp.sdnc.rm.data.ResourceLoad rl = createResourceLoad(r, rlEntity); + r.resourceLoadList.add(rl); + } + } + return rlist; + } + + @Override + public List getResourceUnion(String resourceUnionId) { + List rEntityList = resourceJdbcDao.getResourceUnion(resourceUnionId); + List rlist = new ArrayList(); + for (Resource rEntity : rEntityList) { + org.openecomp.sdnc.rm.data.Resource r = createResource(rEntity); + rlist.add(r); + + List aiEntityList = allocationItemJdbcDao.getAllocationItems(rEntity.id); + r.allocationItems = new ArrayList(); + for (AllocationItem aiEntity : aiEntityList) { + org.openecomp.sdnc.rm.data.AllocationItem ai = createAllocationItem(r, aiEntity); + r.allocationItems.add(ai); + } + + List rlEntityList = resourceLoadJdbcDao.getResourceLoads(rEntity.id); + r.resourceLoadList = new ArrayList(); + for (ResourceLoad rlEntity : rlEntityList) { + org.openecomp.sdnc.rm.data.ResourceLoad rl = createResourceLoad(r, rlEntity); + r.resourceLoadList.add(rl); + } + } + return rlist; + } + + private Resource createResourceEntity(org.openecomp.sdnc.rm.data.Resource resource) { + Resource resourceEntity = new Resource(); + resourceEntity.assetId = resource.resourceKey.assetId; + resourceEntity.name = resource.resourceKey.resourceName; + resourceEntity.type = resource.resourceType.toString(); + if (resource.resourceType == ResourceType.Limit) + resourceEntity.ltUsed = ((LimitResource) resource).used; + else if (resource.resourceType == ResourceType.Label) { + resourceEntity.llLabel = ((LabelResource) resource).label; + resourceEntity.llReferenceCount = ((LabelResource) resource).referenceCount; + } else if (resource.resourceType == ResourceType.Range) + resourceEntity.rrUsed = StrUtil.listInt(((RangeResource) resource).used); + + return resourceEntity; + } + + private ResourceLoad createResourceLoadEntity(long resourceId, org.openecomp.sdnc.rm.data.ResourceLoad rl) { + ResourceLoad rlEntity = new ResourceLoad(); + rlEntity.resourceId = resourceId; + rlEntity.applicationId = rl.applicationId; + rlEntity.loadTime = rl.resourceLoadTime; + rlEntity.expirationTime = rl.resourceExpirationTime; + return rlEntity; + } + + private void updateResourceLoadEntity(ResourceLoad rlEntity, org.openecomp.sdnc.rm.data.ResourceLoad rl) { + rlEntity.loadTime = rl.resourceLoadTime; + rlEntity.expirationTime = rl.resourceExpirationTime; + } + + private AllocationItem createAllocationItemEntity(long resourceId, org.openecomp.sdnc.rm.data.AllocationItem ai) { + AllocationItem aiEntity = new AllocationItem(); + aiEntity.resourceId = resourceId; + aiEntity.resourceSetId = ai.resourceSetId; + aiEntity.resourceUnionId = ai.resourceUnionId; + aiEntity.resourceShareGroupList = StrUtil.listStr(ai.resourceShareGroupList); + aiEntity.applicationId = ai.applicationId; + aiEntity.allocationTime = ai.allocationTime; + if (ai.resourceType == ResourceType.Limit) + aiEntity.ltUsed = ((LimitAllocationItem) ai).used; + else if (ai.resourceType == ResourceType.Label) + aiEntity.llLabel = ((LabelAllocationItem) ai).label; + else if (ai.resourceType == ResourceType.Range) + aiEntity.rrUsed = StrUtil.listInt(((RangeAllocationItem) ai).used); + return aiEntity; + } + + private void updateAllocationItemEntity(AllocationItem aiEntity, org.openecomp.sdnc.rm.data.AllocationItem ai) { + aiEntity.resourceShareGroupList = StrUtil.listStr(ai.resourceShareGroupList); + aiEntity.allocationTime = ai.allocationTime; + if (ai.resourceType == ResourceType.Limit) + aiEntity.ltUsed = ((LimitAllocationItem) ai).used; + else if (ai.resourceType == ResourceType.Label) + aiEntity.llLabel = ((LabelAllocationItem) ai).label; + else if (ai.resourceType == ResourceType.Range) + aiEntity.rrUsed = StrUtil.listInt(((RangeAllocationItem) ai).used); + } + + private void updateResourceEntity(Resource resourceEntity, org.openecomp.sdnc.rm.data.Resource resource) { + if (resource.resourceType == ResourceType.Limit) + resourceEntity.ltUsed = ((LimitResource) resource).used; + else if (resource.resourceType == ResourceType.Label) { + resourceEntity.llLabel = ((LabelResource) resource).label; + resourceEntity.llReferenceCount = ((LabelResource) resource).referenceCount; + } else if (resource.resourceType == ResourceType.Range) + resourceEntity.rrUsed = StrUtil.listInt(((RangeResource) resource).used); + } + + private org.openecomp.sdnc.rm.data.Resource createResource(Resource resourceEntity) { + if (resourceEntity == null) + return null; + + org.openecomp.sdnc.rm.data.Resource r = null; + ResourceType type = ResourceType.valueOf(resourceEntity.type); + if (type == ResourceType.Limit) { + LimitResource l = new LimitResource(); + l.used = resourceEntity.ltUsed; + r = l; + } else if (type == ResourceType.Label) { + LabelResource l = new LabelResource(); + l.label = resourceEntity.llLabel; + l.referenceCount = resourceEntity.llReferenceCount; + r = l; + } else if (type == ResourceType.Range) { + RangeResource rr = new RangeResource(); + rr.used = + StrUtil.listInt(resourceEntity.rrUsed, "Invalid data found in DB in for Resource Id: " + + resourceEntity.id + ": RESOURCE.RR_USED: " + resourceEntity.rrUsed); + r = rr; + } + + r.resourceType = type; + r.resourceKey = new ResourceKey(); + r.resourceKey.assetId = resourceEntity.assetId; + r.resourceKey.resourceName = resourceEntity.name; + + return r; + } + + private org.openecomp.sdnc.rm.data.AllocationItem createAllocationItem( + org.openecomp.sdnc.rm.data.Resource r, + AllocationItem aiEntity) { + if (r == null || aiEntity == null) + return null; + + org.openecomp.sdnc.rm.data.AllocationItem ai = null; + if (r.resourceType == ResourceType.Limit) { + LimitAllocationItem lai = new LimitAllocationItem(); + lai.used = aiEntity.ltUsed; + ai = lai; + } else if (r.resourceType == ResourceType.Label) { + LabelAllocationItem lai = new LabelAllocationItem(); + lai.label = aiEntity.llLabel; + ai = lai; + } else if (r.resourceType == ResourceType.Range) { + RangeAllocationItem rai = new RangeAllocationItem(); + rai.used = + StrUtil.listInt(aiEntity.rrUsed, "Invalid data found in DB in for Allocation Item Id: " + + aiEntity.id + ": ALLOCATION_ITEM.RR_USED: " + aiEntity.rrUsed); + ai = rai; + } + + ai.resourceType = r.resourceType; + ai.resourceKey = r.resourceKey; + ai.resourceSetId = aiEntity.resourceSetId; + ai.resourceUnionId = aiEntity.resourceUnionId; + if (aiEntity.resourceShareGroupList != null) + ai.resourceShareGroupList = new HashSet(StrUtil.listStr(aiEntity.resourceShareGroupList)); + ai.applicationId = aiEntity.applicationId; + ai.allocationTime = aiEntity.allocationTime; + + return ai; + } + + private org.openecomp.sdnc.rm.data.ResourceLoad createResourceLoad( + org.openecomp.sdnc.rm.data.Resource r, + ResourceLoad rlEntity) { + if (rlEntity == null) + return null; + + org.openecomp.sdnc.rm.data.ResourceLoad rl = new org.openecomp.sdnc.rm.data.ResourceLoad(); + rl.resourceKey = r.resourceKey; + rl.applicationId = rlEntity.applicationId; + rl.resourceLoadTime = rlEntity.loadTime; + rl.resourceExpirationTime = rlEntity.expirationTime; + + return rl; + } + + public void setResourceJdbcDao(ResourceJdbcDao resourceJdbcDao) { + this.resourceJdbcDao = resourceJdbcDao; + } + + public void setResourceLoadJdbcDao(ResourceLoadJdbcDao resourceLoadJdbcDao) { + this.resourceLoadJdbcDao = resourceLoadJdbcDao; + } + + public void setAllocationItemJdbcDao(AllocationItemJdbcDao allocationItemJdbcDao) { + this.allocationItemJdbcDao = allocationItemJdbcDao; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceJdbcDao.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceJdbcDao.java new file mode 100644 index 00000000..645c377e --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceJdbcDao.java @@ -0,0 +1,39 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.dao.jdbc; + +import java.util.List; + +public interface ResourceJdbcDao { + + Resource getResource(String assetId, String resourceName); + + List getResourceSet(String resourceSetId); + + List getResourceUnion(String resourceUnionId); + + void add(Resource r); + + void delete(long id); + + void update(Resource r); +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceJdbcDaoImpl.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceJdbcDaoImpl.java new file mode 100644 index 00000000..5e529f70 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceJdbcDaoImpl.java @@ -0,0 +1,144 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.dao.jdbc; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Collections; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.PreparedStatementCreator; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; + +public class ResourceJdbcDaoImpl implements ResourceJdbcDao { + + @SuppressWarnings("unused") + private static final Logger log = LoggerFactory.getLogger(ResourceJdbcDaoImpl.class); + + private static final String RESOURCE_SQL = "SELECT * FROM RESOURCE WHERE asset_id = ? AND resource_name = ?"; + + private static final String RESOURCE_SET_SQL = "SELECT * FROM RESOURCE WHERE resource_id IN (\n" + + "SELECT DISTINCT resource_id FROM ALLOCATION_ITEM WHERE resource_set_id = ?)"; + + private static final String RESOURCE_UNION_SQL = "SELECT * FROM RESOURCE WHERE resource_id IN (\n" + + "SELECT DISTINCT resource_id FROM ALLOCATION_ITEM WHERE resource_union_id = ?)"; + + private static final String INSERT_SQL = "INSERT INTO RESOURCE (\n" + + " asset_id, resource_name, resource_type, lt_used, ll_label, ll_reference_count, rr_used)\n" + + "VALUES (?, ?, ?, ?, ?, ?, ?)"; + + private static final String UPDATE_SQL = "UPDATE RESOURCE SET\n" + + " lt_used = ?, ll_label = ?, ll_reference_count = ?, rr_used = ?\nWHERE resource_id = ?"; + + private static final String DELETE_SQL = "DELETE FROM RESOURCE WHERE resource_id = ?"; + + private JdbcTemplate jdbcTemplate; + private ResourceRowMapper resourceRowMapper = new ResourceRowMapper(); + + @Override + public Resource getResource(String assetId, String resourceName) { + if (assetId == null || assetId.trim().length() == 0 || resourceName == null || + resourceName.trim().length() == 0) + return null; + + List ll = jdbcTemplate.query(RESOURCE_SQL, new Object[] { assetId, resourceName }, resourceRowMapper); + return ll.isEmpty() ? null : ll.get(0); + } + + @Override + public List getResourceSet(String resourceSetId) { + if (resourceSetId == null) + return Collections.emptyList(); + + return jdbcTemplate.query(RESOURCE_SET_SQL, new Object[] { resourceSetId }, resourceRowMapper); + } + + @Override + public List getResourceUnion(String resourceUnionId) { + if (resourceUnionId == null) + return Collections.emptyList(); + + return jdbcTemplate.query(RESOURCE_UNION_SQL, new Object[] { resourceUnionId }, resourceRowMapper); + } + + @Override + public void add(final Resource r) { + PreparedStatementCreator psc = new PreparedStatementCreator() { + + @Override + public PreparedStatement createPreparedStatement(Connection dbc) throws SQLException { + PreparedStatement ps = dbc.prepareStatement(INSERT_SQL, new String[] { "resource_id" }); + ps.setString(1, r.assetId); + ps.setString(2, r.name); + ps.setString(3, r.type); + ps.setLong(4, r.ltUsed); + ps.setString(5, r.llLabel); + ps.setInt(6, r.llReferenceCount); + ps.setString(7, r.rrUsed); + return ps; + } + }; + KeyHolder keyHolder = new GeneratedKeyHolder(); + jdbcTemplate.update(psc, keyHolder); + r.id = keyHolder.getKey().longValue(); + } + + @Override + public void update(Resource r) { + Long ltUsed = r.ltUsed <= 0 ? null : r.ltUsed; + Integer llRefCount = r.llReferenceCount <= 0 ? null : r.llReferenceCount; + jdbcTemplate.update(UPDATE_SQL, ltUsed, r.llLabel, llRefCount, r.rrUsed, r.id); + } + + @Override + public void delete(long id) { + jdbcTemplate.update(DELETE_SQL, id); + } + + private static class ResourceRowMapper implements RowMapper { + + @Override + public Resource mapRow(ResultSet rs, int arg1) throws SQLException { + Resource r = new Resource(); + r.id = rs.getLong("resource_id"); + r.assetId = rs.getString("asset_id"); + r.name = rs.getString("resource_name"); + r.type = rs.getString("resource_type"); + r.ltUsed = rs.getLong("lt_used"); + r.llLabel = rs.getString("ll_label"); + r.llReferenceCount = rs.getInt("ll_reference_count"); + r.rrUsed = rs.getString("rr_used"); + return r; + } + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceLoad.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceLoad.java new file mode 100644 index 00000000..5c810b1d --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceLoad.java @@ -0,0 +1,33 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.dao.jdbc; + +import java.util.Date; + +public class ResourceLoad { + + public long id; + public long resourceId; + public String applicationId; + public Date loadTime; + public Date expirationTime; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceLoadJdbcDao.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceLoadJdbcDao.java new file mode 100644 index 00000000..9a337a83 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceLoadJdbcDao.java @@ -0,0 +1,36 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.dao.jdbc; + +import java.util.List; + +public interface ResourceLoadJdbcDao { + + void add(ResourceLoad rl); + + List getResourceLoads(long resourceId); + + void update(ResourceLoad rl); + + void delete(long id); + +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceLoadJdbcDaoImpl.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceLoadJdbcDaoImpl.java new file mode 100644 index 00000000..854b6696 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceLoadJdbcDaoImpl.java @@ -0,0 +1,112 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.dao.jdbc; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.Collections; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.PreparedStatementCreator; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; + +public class ResourceLoadJdbcDaoImpl implements ResourceLoadJdbcDao { + + @SuppressWarnings("unused") + private static final Logger log = LoggerFactory.getLogger(ResourceJdbcDaoImpl.class); + + private static final String INSERT_SQL = "INSERT INTO RESOURCE_LOAD (\n" + + " resource_id, application_id, resource_load_time, resource_expiration_time)\nVALUES (?, ?, ?, ?)"; + + private static final String UPDATE_SQL = "UPDATE RESOURCE_LOAD SET\n" + + " resource_load_time = ?, resource_expiration_time = ?\nWHERE resource_id = ?"; + + private static final String DELETE_SQL = "DELETE FROM RESOURCE_LOAD WHERE resource_load_id = ?"; + + private static final String GET_SQL = "SELECT * FROM RESOURCE_LOAD WHERE resource_id = ?"; + + private JdbcTemplate jdbcTemplate; + private ResourceLoadRowMapper resourceLoadRowMapper = new ResourceLoadRowMapper(); + + @Override + public void add(final ResourceLoad rl) { + PreparedStatementCreator psc = new PreparedStatementCreator() { + + @Override + public PreparedStatement createPreparedStatement(Connection dbc) throws SQLException { + PreparedStatement ps = dbc.prepareStatement(INSERT_SQL, new String[] { "resource_load_id" }); + ps.setLong(1, rl.resourceId); + ps.setString(2, rl.applicationId); + ps.setTimestamp(3, new Timestamp(rl.loadTime.getTime())); + ps.setTimestamp(4, new Timestamp(rl.expirationTime.getTime())); + return ps; + } + }; + KeyHolder keyHolder = new GeneratedKeyHolder(); + jdbcTemplate.update(psc, keyHolder); + rl.id = keyHolder.getKey().longValue(); + } + + @Override + public void update(ResourceLoad rl) { + jdbcTemplate.update(UPDATE_SQL, rl.loadTime, rl.expirationTime, rl.id); + } + + @Override + public void delete(long id) { + jdbcTemplate.update(DELETE_SQL, id); + } + + @Override + public List getResourceLoads(long resourceId) { + if (resourceId <= 0) + return Collections.emptyList(); + + return jdbcTemplate.query(GET_SQL, new Object[] { resourceId }, resourceLoadRowMapper); + } + + private static class ResourceLoadRowMapper implements RowMapper { + + @Override + public ResourceLoad mapRow(ResultSet rs, int n) throws SQLException { + ResourceLoad rl = new ResourceLoad(); + rl.id = rs.getLong("allocation_item_id"); + rl.resourceId = rs.getLong("resource_id"); + rl.applicationId = rs.getString("application_id"); + rl.loadTime = rs.getTimestamp("resource_load_time"); + rl.expirationTime = rs.getTimestamp("resource_expiration_time"); + return rl; + } + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/AllocationAction.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/AllocationAction.java new file mode 100644 index 00000000..c791d427 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/AllocationAction.java @@ -0,0 +1,26 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +public enum AllocationAction { + Fail, Succeed_DoNothing, Succeed_Allocate +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/AllocationItem.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/AllocationItem.java new file mode 100644 index 00000000..f4cabf96 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/AllocationItem.java @@ -0,0 +1,36 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +import java.util.Date; +import java.util.Set; + +public abstract class AllocationItem { + + public ResourceKey resourceKey; + public ResourceType resourceType; + public String resourceSetId; + public String resourceUnionId; + public Set resourceShareGroupList; + public String applicationId; + public Date allocationTime; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/AllocationOutcome.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/AllocationOutcome.java new file mode 100644 index 00000000..20ecf051 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/AllocationOutcome.java @@ -0,0 +1,28 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +public class AllocationOutcome { + + public AllocationStatus status = null; + public AllocationRequest request = null; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/AllocationRequest.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/AllocationRequest.java new file mode 100644 index 00000000..d54475ff --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/AllocationRequest.java @@ -0,0 +1,35 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +import java.util.Set; + +public class AllocationRequest { + + public String resourceUnionId = null; + public String resourceSetId = null; + public Set resourceShareGroupList = null; + public String resourceName = null; + public String assetId = null; + public AllocationAction missingResourceAction = AllocationAction.Succeed_Allocate; + public AllocationAction expiredResourceAction = AllocationAction.Succeed_Allocate; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/AllocationStatus.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/AllocationStatus.java new file mode 100644 index 00000000..a18077a1 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/AllocationStatus.java @@ -0,0 +1,27 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +public enum AllocationStatus { + + Success, Failure, NotTried, ResourceNotFound, ResourceExpired +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/InitAction.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/InitAction.java new file mode 100644 index 00000000..8b9dfaa3 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/InitAction.java @@ -0,0 +1,36 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +public enum InitAction { + CheckInit("Initialize if needed"), ForceInit("Always Initialize"), NoInit("No initialization"); + + private String str; + + private InitAction(String str) { + this.str = str; + } + + public String getInitActionStr() { + return str; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LabelAllocationItem.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LabelAllocationItem.java new file mode 100644 index 00000000..e456542c --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LabelAllocationItem.java @@ -0,0 +1,27 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +public class LabelAllocationItem extends AllocationItem { + + public String label; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LabelAllocationOutcome.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LabelAllocationOutcome.java new file mode 100644 index 00000000..d0cb2c52 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LabelAllocationOutcome.java @@ -0,0 +1,28 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +public class LabelAllocationOutcome extends AllocationOutcome { + + public String allocatedLabel = null; + public String currentLabel = null; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LabelAllocationRequest.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LabelAllocationRequest.java new file mode 100644 index 00000000..2b6ce033 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LabelAllocationRequest.java @@ -0,0 +1,29 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +public class LabelAllocationRequest extends AllocationRequest { + + public String label = null; + public boolean check = false; + public boolean allocate = false; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LabelResource.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LabelResource.java new file mode 100644 index 00000000..54bfb852 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LabelResource.java @@ -0,0 +1,30 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +public class LabelResource extends Resource { + + public static final String BLOCKED = "__BLOCKED__"; + + public String label; + public int referenceCount; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LimitAllocationItem.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LimitAllocationItem.java new file mode 100644 index 00000000..270220a8 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LimitAllocationItem.java @@ -0,0 +1,27 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +public class LimitAllocationItem extends AllocationItem { + + public long used; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LimitAllocationOutcome.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LimitAllocationOutcome.java new file mode 100644 index 00000000..f1c13c08 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LimitAllocationOutcome.java @@ -0,0 +1,29 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +public class LimitAllocationOutcome extends AllocationOutcome { + + public long allocatedCount = 0; + public long used = 0; + public long limit = 0; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LimitAllocationRequest.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LimitAllocationRequest.java new file mode 100644 index 00000000..787715bb --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LimitAllocationRequest.java @@ -0,0 +1,31 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +public class LimitAllocationRequest extends AllocationRequest { + + public long checkCount = 0; + public long allocateCount = 0; + public long checkLimit = -1; + public boolean replace = false; + public boolean strict = false; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LimitResource.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LimitResource.java new file mode 100644 index 00000000..cad0ba23 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LimitResource.java @@ -0,0 +1,27 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +public class LimitResource extends Resource { + + public long used = 0; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/MultiAssetAllocationOutcome.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/MultiAssetAllocationOutcome.java new file mode 100644 index 00000000..bf9bbbfa --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/MultiAssetAllocationOutcome.java @@ -0,0 +1,30 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +import java.util.List; + +public class MultiAssetAllocationOutcome extends AllocationOutcome { + + public List goodAssetIdList; + public List allocationOutcomeList; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/MultiAssetAllocationRequest.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/MultiAssetAllocationRequest.java new file mode 100644 index 00000000..da1a96d7 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/MultiAssetAllocationRequest.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +import java.util.List; + +public class MultiAssetAllocationRequest extends AllocationRequest { + + public List assetIdList = null; + public AllocationRequest allocationRequest = null; + public int requestedCount = 0; + public boolean sequential = false; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/MultiResourceAllocationOutcome.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/MultiResourceAllocationOutcome.java new file mode 100644 index 00000000..9deca6c2 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/MultiResourceAllocationOutcome.java @@ -0,0 +1,29 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +import java.util.List; + +public class MultiResourceAllocationOutcome extends AllocationOutcome { + + public List allocationOutcomeList; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/MultiResourceAllocationRequest.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/MultiResourceAllocationRequest.java new file mode 100644 index 00000000..9e48a31e --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/MultiResourceAllocationRequest.java @@ -0,0 +1,30 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +import java.util.List; + +public class MultiResourceAllocationRequest extends AllocationRequest { + + public List allocationRequestList = null; + public boolean stopOnFirstFailure = true; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/RangeAllocationItem.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/RangeAllocationItem.java new file mode 100644 index 00000000..229c8e44 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/RangeAllocationItem.java @@ -0,0 +1,29 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +import java.util.SortedSet; + +public class RangeAllocationItem extends AllocationItem { + + public SortedSet used; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/RangeAllocationOutcome.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/RangeAllocationOutcome.java new file mode 100644 index 00000000..8b35d9f0 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/RangeAllocationOutcome.java @@ -0,0 +1,30 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +import java.util.SortedSet; + +public class RangeAllocationOutcome extends AllocationOutcome { + + public SortedSet allocated = null; + public SortedSet used = null; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/RangeAllocationRequest.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/RangeAllocationRequest.java new file mode 100644 index 00000000..0732613d --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/RangeAllocationRequest.java @@ -0,0 +1,36 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +import java.util.SortedSet; + +public class RangeAllocationRequest extends AllocationRequest { + + public int checkMin = 0; + public int checkMax = 0; + public boolean check = false; + public boolean allocate = false; + public boolean replace = false; + public SortedSet requestedNumbers = null; + public int requestedCount = 1; + public boolean sequential = false; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/RangeResource.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/RangeResource.java new file mode 100644 index 00000000..99a2b207 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/RangeResource.java @@ -0,0 +1,29 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +import java.util.SortedSet; + +public class RangeResource extends Resource { + + public SortedSet used; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/Resource.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/Resource.java new file mode 100644 index 00000000..b04f7105 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/Resource.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +import java.util.Collection; + +public abstract class Resource { + + public ResourceKey resourceKey; + public ResourceType resourceType; + public Collection allocationItems; + public Collection resourceLoadList; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/ResourceKey.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/ResourceKey.java new file mode 100644 index 00000000..b303b07f --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/ResourceKey.java @@ -0,0 +1,50 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +public class ResourceKey { + + public String assetId; + public String resourceName; + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || !(o instanceof ResourceKey)) + return false; + ResourceKey rk = (ResourceKey) o; + if (assetId == null || resourceName == null) + return false; + return assetId.equals(rk.assetId) && resourceName.equals(rk.resourceName); + } + + @Override + public int hashCode() { + return (int) ((long) System.identityHashCode(assetId) + (long) System.identityHashCode(resourceName)); + } + + @Override + public String toString() { + return "(" + assetId + ", " + resourceName + ")"; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/ResourceLoad.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/ResourceLoad.java new file mode 100644 index 00000000..06970cbc --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/ResourceLoad.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +import java.util.Date; + +public class ResourceLoad { + + public ResourceKey resourceKey; + public String applicationId; + public Date resourceLoadTime; + public Date resourceExpirationTime; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/ResourceType.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/ResourceType.java new file mode 100644 index 00000000..1d8b9c4c --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/ResourceType.java @@ -0,0 +1,26 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.data; + +public enum ResourceType { + Limit, Label, Range +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/util/LabelUtil.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/util/LabelUtil.java new file mode 100644 index 00000000..bbaa3a37 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/util/LabelUtil.java @@ -0,0 +1,95 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.util; + +import java.util.ArrayList; +import java.util.Date; + +import org.openecomp.sdnc.rm.data.AllocationItem; +import org.openecomp.sdnc.rm.data.LabelAllocationItem; +import org.openecomp.sdnc.rm.data.LabelAllocationRequest; +import org.openecomp.sdnc.rm.data.LabelResource; +import org.openecomp.sdnc.rm.data.ResourceKey; +import org.openecomp.sdnc.rm.data.ResourceType; + +public class LabelUtil { + + public static boolean checkLabel(LabelResource l, LabelAllocationRequest req) { + if (req.check && req.label != null && l.allocationItems != null && !l.allocationItems.isEmpty()) { + for (AllocationItem ai : l.allocationItems) { + LabelAllocationItem lai = (LabelAllocationItem) ai; + if (!eq(req.resourceUnionId, lai.resourceUnionId) && !eq(req.label, lai.label)) + return false; + } + } + return true; + } + + public static String allocateLabel(LabelResource l, LabelAllocationRequest req, String applicationId) { + if (!req.allocate) + return null; + + LabelAllocationItem lai = (LabelAllocationItem) ResourceUtil.getAllocationItem(l, req.resourceSetId); + if (lai == null) { + lai = new LabelAllocationItem(); + lai.resourceType = ResourceType.Label; + lai.resourceKey = new ResourceKey(); + lai.resourceKey.assetId = req.assetId; + lai.resourceKey.resourceName = req.resourceName; + lai.applicationId = applicationId; + lai.resourceSetId = req.resourceSetId; + lai.resourceUnionId = req.resourceUnionId; + lai.resourceShareGroupList = req.resourceShareGroupList; + + if (l.allocationItems == null) + l.allocationItems = new ArrayList(); + l.allocationItems.add(lai); + } + + lai.label = req.label; + lai.allocationTime = new Date(); + + recalculate(l); + + return lai.label; + } + + public static void recalculate(LabelResource l) { + l.label = null; + l.referenceCount = 0; + if (l.allocationItems != null) + for (AllocationItem ai : l.allocationItems) { + LabelAllocationItem lai = (LabelAllocationItem) ai; + if (lai.label != null) { + l.referenceCount++; + if (l.label == null) + l.label = lai.label; + else if (!l.label.equals(lai.label)) + l.label = "__BLOCKED__"; + } + } + } + + private static boolean eq(Object o1, Object o2) { + return o1 == null ? o2 == null : o1.equals(o2); + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/util/LimitUtil.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/util/LimitUtil.java new file mode 100644 index 00000000..45799560 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/util/LimitUtil.java @@ -0,0 +1,334 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.util; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.openecomp.sdnc.rm.data.AllocationItem; +import org.openecomp.sdnc.rm.data.LimitAllocationItem; +import org.openecomp.sdnc.rm.data.LimitAllocationRequest; +import org.openecomp.sdnc.rm.data.LimitResource; +import org.openecomp.sdnc.rm.data.ResourceKey; +import org.openecomp.sdnc.rm.data.ResourceType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class LimitUtil { + + private static final Logger log = LoggerFactory.getLogger(LimitUtil.class); + + public static boolean checkLimit(LimitResource l, LimitAllocationRequest req) { + if (req.checkCount <= 0) + return true; + + long checkCount = req.checkCount; + long currentUsage = 0; + if (req.resourceSetId != null) { + LimitAllocationItem lai = (LimitAllocationItem) ResourceUtil.getAllocationItem(l, req.resourceSetId); + if (lai != null) + currentUsage = lai.used; + } + if (!req.replace) + checkCount += currentUsage; + + long used = calculateLimitUsage(l, 0, null, null); + long wouldUse = calculateLimitUsage(l, checkCount, req.resourceUnionId, req.resourceShareGroupList); + + // If usage is not increasing by this request, only check the limit if + // strictCheck is true. + if (wouldUse <= used && !req.strict) + return true; + + return wouldUse <= req.checkLimit; + } + + private static long calculateLimitUsage( + LimitResource l, + long checkCount, + String resourceUnionId, + Set resourceShareGroupList) { + if ((l.allocationItems == null || l.allocationItems.isEmpty()) && + (resourceUnionId == null || resourceUnionId.length() == 0)) + return 0; + + long t1 = System.currentTimeMillis(); + boolean logit = false; + String rn = "Resource: " + l.resourceKey.resourceName + " - " + l.resourceKey.assetId; + + // In order to best utilize the resource, we need to take not the sum of all allocation items, but + // instead the maximum usage that could happen at any moment of time (given not all allocation items are active + // at the same time), also taking into account possible resource sharing. + // Thus we need to find all combinations of allocation items that can be active at the same time (allocation + // items with the same first union cannot be active at the same time), compute the usage for each (again, + // taking into account resource sharing), and take the maximum. + // + // Example: + // Let's have the following allocation items: + // ai1: sdid1, vrf1 - usage 5 + // ai2: sdid2, vrf1 - usage 10 + // ai3: sdid3, vrf2 - usage 15 + // ai4: sdid1, vrf3 - usage 20 + // ai5: sdid3, vrf1 - usage 25 + // The following combinations of active allocation items are possible: + // 1) ai1, ai2, ai3 + // 2) ai1, ai2, ai5 + // 3) ai2, ai3, ai4 + // 4) ai2, ai3, ai5 + // Here is how we calculate the usage for combination 1: + // ai1 and ai2 contain the same resource union vrf1, so they share the resource - we take the max of usage, + // so we have: + // max(5, 10) + 15 = 25 + // Similarly, we calculate the usage of the other combinations: + // 2) max(5, 10, 25) = 25 + // 3) 10 + 15 + 20 = 45 + // 4) max(10, 25) + 15 = 40 + // So, the result in this case is: + // max(25, 25, 45, 40) = 45 + // + // We might have a problem with this approach, if we have a lot of combinations. Assuming we have at most 2 + // allocation items with the same resource union (sdid), the number of combinations would be + // 2 ^ n + // where n is the number of allocation items that have the same resource union (sdid). That would be + // the number of change orders currently in progress. + // + // Here is one optimization that we can do: + // If we have allocation items that have all resource unions the same, we don't need to generate combinations + // with each of them, we can just take the one of them with the maximum usage, as it is clear that the others + // will not lead to a bigger usage. + // For example, if we had the following allocation items: + // ai1: sdid1, vrf1 - usage 10 + // ai2: sdid1, vrf1 - usage 20 + // We only need to take the combinations with ai2, as they will always lead to bigger usage than the remaining + // combinations with ai1. + + // First, group the allocation items by the first resource union, using the LimitUsage structure + int regularChangeCount = 0; + Map> limitUsageMap = new HashMap>(); + if (l.allocationItems != null) + for (AllocationItem ai : l.allocationItems) { + LimitAllocationItem lai = (LimitAllocationItem) ai; + boolean regularChange = + addLimitUsage(limitUsageMap, lai.resourceUnionId, lai.resourceShareGroupList, lai.used); + if (regularChange) + regularChangeCount++; + } + if (checkCount > 0 && resourceUnionId != null) { + boolean regularChange = addLimitUsage(limitUsageMap, resourceUnionId, resourceShareGroupList, checkCount); + if (regularChange) + regularChangeCount++; + } + + // Generate all the combinations, containing one LimitUsage object for each firstResourceUnion + int significantChangeCount = 0; + List> allCombinations = new ArrayList>(); + for (String firstResourceUnion : limitUsageMap.keySet()) { + List limitUsageList = limitUsageMap.get(firstResourceUnion); + if (limitUsageList.size() > 1) + significantChangeCount++; + if (allCombinations.isEmpty()) { + for (LimitUsage limitUsage : limitUsageList) { + List newCombination = new ArrayList(); + newCombination.add(limitUsage); + allCombinations.add(newCombination); + } + } else { + if (limitUsageList.size() == 1) { + // No new combinations are generated - just add this one to all combinations we have until now + for (List combination : allCombinations) + combination.add(limitUsageList.get(0)); + } else { + // We have to duplicate each of the current combinations for each element of limitUsageList + List> newAllCombinations = new ArrayList>(); + for (List combination : allCombinations) + for (LimitUsage limitUsage : limitUsageList) { + List newCombination = new ArrayList(combination); + newCombination.add(limitUsage); + newAllCombinations.add(newCombination); + } + allCombinations = newAllCombinations; + } + } + } + + // Now, go through all combinations and calculate its usage, get the maximum + long maxUsage = 0; + for (List combination : allCombinations) { + long usage = calculateUsage(combination); + if (usage > maxUsage) + maxUsage = usage; + } + + long t2 = System.currentTimeMillis(); + if (logit) { + log.debug(rn + ": Calculating usage completed:"); + log.debug(rn + ": Regular changes: " + regularChangeCount); + log.debug(rn + ": Significant changes: " + significantChangeCount); + log.debug(rn + ": Combinations: " + allCombinations.size()); + log.debug(rn + ": Usage: " + maxUsage); + log.debug(rn + ": Time: " + (t2 - t1)); + } + + return maxUsage; + } + + private static boolean addLimitUsage( + Map> limitUsageMap, + String resourceUnionId, + Set resourceShareGroupList, + long used) { + List limitUsageList = limitUsageMap.get(resourceUnionId); + if (limitUsageList == null) { + limitUsageList = new ArrayList(); + limitUsageMap.put(resourceUnionId, limitUsageList); + } + // See if we already have the same shareResourceUnionSet in the list. In such case just update the usage + // to the bigger value. + LimitUsage limitUsage = null; + for (LimitUsage limitUsage1 : limitUsageList) { + if ((limitUsage1.resourceShareGroupList == null || limitUsage1.resourceShareGroupList.isEmpty()) && + (resourceShareGroupList == null || resourceShareGroupList.isEmpty())) { + limitUsage = limitUsage1; + break; + } + if (limitUsage1.resourceShareGroupList != null && + limitUsage1.resourceShareGroupList.equals(resourceShareGroupList)) { + limitUsage = limitUsage1; + break; + } + } + if (limitUsage != null) { + if (limitUsage.usage < used) + limitUsage.usage = used; + return true; + } + + limitUsage = new LimitUsage(); + limitUsage.resourceUnion = resourceUnionId; + limitUsage.resourceShareGroupList = resourceShareGroupList; + limitUsage.usage = used; + limitUsageList.add(limitUsage); + return false; + } + + private static class LimitUsage { + + @SuppressWarnings("unused") + public String resourceUnion; + public Set resourceShareGroupList; + public long usage; + } + + private static boolean hasCommonSharedResource(LimitUsage limitUsage1, LimitUsage limitUsage2) { + if (limitUsage1.resourceShareGroupList == null || limitUsage1.resourceShareGroupList.isEmpty()) + return false; + if (limitUsage2.resourceShareGroupList == null || limitUsage2.resourceShareGroupList.isEmpty()) + return false; + + for (String resourceUnion : limitUsage1.resourceShareGroupList) + if (limitUsage2.resourceShareGroupList.contains(resourceUnion)) + return true; + + return false; + } + + private static long calculateUsage(List combination) { + // All LimitUsage objects that have a common value in their sharedResourceUnionSet reuse the resource, so + // split the combination in sets that have common value. Then the usage of each set will be the maximum of + // the usages of the LimitUsage objects in the set. The usage of the combination will be the sum of the usages + // of all sets. + List> sharedSets = new ArrayList>(); + for (LimitUsage limitUsage : combination) { + // See if we can put limitUsage in any of the existing sets - is it has a common resource union with + // any of the LimitUsage objects in a set. + boolean found = false; + for (List sharedSet : sharedSets) { + for (LimitUsage limitUsage1 : sharedSet) { + if (hasCommonSharedResource(limitUsage, limitUsage1)) { + found = true; + break; + } + } + if (found) { + sharedSet.add(limitUsage); + break; + } + } + if (!found) { + // Start a new set + List newSharedSet = new ArrayList(); + newSharedSet.add(limitUsage); + sharedSets.add(newSharedSet); + } + } + + long sum = 0; + for (List sharedSet : sharedSets) { + float max = 0; + for (LimitUsage limitUsage : sharedSet) + if (max < limitUsage.usage) + max = limitUsage.usage; + sum += max; + } + + return sum; + } + + public static long allocateLimit(LimitResource l, LimitAllocationRequest req, String applicationId) { + if (req.allocateCount <= 0) + return 0; + long uu = l.used; + + LimitAllocationItem lai = (LimitAllocationItem) ResourceUtil.getAllocationItem(l, req.resourceSetId); + if (lai == null) { + lai = new LimitAllocationItem(); + lai.resourceType = ResourceType.Limit; + lai.resourceKey = new ResourceKey(); + lai.resourceKey.assetId = req.assetId; + lai.resourceKey.resourceName = req.resourceName; + lai.applicationId = applicationId; + lai.resourceSetId = req.resourceSetId; + lai.resourceUnionId = req.resourceUnionId; + lai.resourceShareGroupList = req.resourceShareGroupList; + lai.used = req.allocateCount; + + if (l.allocationItems == null) + l.allocationItems = new ArrayList(); + l.allocationItems.add(lai); + } else + lai.used = req.replace ? req.allocateCount : lai.used + req.allocateCount; + + lai.allocationTime = new Date(); + + recalculate(l); + + return l.used - uu; + } + + public static void recalculate(LimitResource l) { + l.used = calculateLimitUsage(l, 0, null, null); + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/util/RangeUtil.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/util/RangeUtil.java new file mode 100644 index 00000000..af828314 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/util/RangeUtil.java @@ -0,0 +1,110 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.util; + +import java.util.ArrayList; +import java.util.Date; +import java.util.SortedSet; +import java.util.TreeSet; + +import org.openecomp.sdnc.rm.data.AllocationItem; +import org.openecomp.sdnc.rm.data.RangeAllocationItem; +import org.openecomp.sdnc.rm.data.RangeAllocationRequest; +import org.openecomp.sdnc.rm.data.RangeResource; +import org.openecomp.sdnc.rm.data.ResourceKey; +import org.openecomp.sdnc.rm.data.ResourceType; + +public class RangeUtil { + + public static void recalculate(RangeResource r) { + r.used = new TreeSet(); + if (r.allocationItems != null) + for (AllocationItem ai : r.allocationItems) { + RangeAllocationItem rai = (RangeAllocationItem) ai; + if (rai.used != null) + r.used.addAll(rai.used); + } + } + + public static boolean checkRange(RangeResource r, RangeAllocationRequest req, int num) { + if (num < req.checkMin || num > req.checkMax) + return false; + + if (r.allocationItems != null) + for (AllocationItem ai : r.allocationItems) { + RangeAllocationItem rai = (RangeAllocationItem) ai; + if (!eq(req.resourceUnionId, rai.resourceUnionId) && rai.used != null && rai.used.contains(num)) + return false; + } + + return true; + } + + private static boolean eq(Object o1, Object o2) { + return o1 == null ? o2 == null : o1.equals(o2); + } + + public static SortedSet getUsed(RangeResource r, String resourceUnionId) { + SortedSet used = new TreeSet(); + if (r.allocationItems != null) + for (AllocationItem ai : r.allocationItems) { + RangeAllocationItem rai = (RangeAllocationItem) ai; + if (eq(resourceUnionId, rai.resourceUnionId) && rai.used != null) + used.addAll(rai.used); + } + return used; + } + + public static void allocateRange( + RangeResource rr, + SortedSet requestedNumbers, + RangeAllocationRequest req, + String applicationId) { + if (!req.allocate) + return; + + RangeAllocationItem rai = (RangeAllocationItem) ResourceUtil.getAllocationItem(rr, req.resourceSetId); + if (rai == null) { + rai = new RangeAllocationItem(); + rai.resourceType = ResourceType.Range; + rai.resourceKey = new ResourceKey(); + rai.resourceKey.assetId = req.assetId; + rai.resourceKey.resourceName = req.resourceName; + rai.applicationId = applicationId; + rai.resourceSetId = req.resourceSetId; + rai.resourceUnionId = req.resourceUnionId; + rai.resourceShareGroupList = req.resourceShareGroupList; + rai.used = requestedNumbers; + + if (rr.allocationItems == null) + rr.allocationItems = new ArrayList(); + rr.allocationItems.add(rai); + } else if (req.replace) + rai.used = requestedNumbers; + else + rai.used.addAll(requestedNumbers); + + rai.allocationTime = new Date(); + + recalculate(rr); + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/util/ResourceUtil.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/util/ResourceUtil.java new file mode 100644 index 00000000..7afe7b5d --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/util/ResourceUtil.java @@ -0,0 +1,49 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.rm.util; + +import org.openecomp.sdnc.rm.data.AllocationItem; +import org.openecomp.sdnc.rm.data.LabelResource; +import org.openecomp.sdnc.rm.data.LimitResource; +import org.openecomp.sdnc.rm.data.Resource; +import org.openecomp.sdnc.rm.data.ResourceType; + +public class ResourceUtil { + + public static AllocationItem getAllocationItem(Resource r, String resourceSetId) { + if (r.allocationItems != null) + for (AllocationItem ai : r.allocationItems) + if (ai.resourceSetId != null && ai.resourceSetId.equals(resourceSetId)) + return ai; + return null; + } + + public static void recalculate(Resource r) { + if (r == null) + return; + + if (r.resourceType == ResourceType.Limit) + LimitUtil.recalculate((LimitResource) r); + else if (r.resourceType == ResourceType.Label) + LabelUtil.recalculate((LabelResource) r); + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/db/CachedDataSourceWrap.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/db/CachedDataSourceWrap.java new file mode 100644 index 00000000..8918ce0c --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/db/CachedDataSourceWrap.java @@ -0,0 +1,122 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.util.db; + +import java.io.PrintWriter; +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; + +import javax.sql.DataSource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CachedDataSourceWrap implements DataSource { + + private static final Logger log = LoggerFactory.getLogger(CachedDataSourceWrap.class); + + private ThreadLocal con = new ThreadLocal<>(); + + private DataSource dataSource; + + @Override + public PrintWriter getLogWriter() throws SQLException { + return dataSource.getLogWriter(); + } + + @Override + public void setLogWriter(PrintWriter out) throws SQLException { + dataSource.setLogWriter(out); + } + + @Override + public void setLoginTimeout(int seconds) throws SQLException { + dataSource.setLoginTimeout(seconds); + } + + @Override + public int getLoginTimeout() throws SQLException { + return dataSource.getLoginTimeout(); + } + + @Override + public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedException { + return dataSource.getParentLogger(); + } + + @Override + public T unwrap(Class iface) throws SQLException { + return dataSource.unwrap(iface); + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + return dataSource.isWrapperFor(iface); + } + + @Override + public Connection getConnection() throws SQLException { + if (con.get() == null) { + Connection c = dataSource.getConnection(); + ConnectionWrap cc = new ConnectionWrap(c); + con.set(cc); + + log.info("Got new DB connection: " + c); + } else + log.info("Using thread DB connection: " + con.get().getCon()); + + return con.get(); + } + + @Override + public Connection getConnection(String username, String password) throws SQLException { + if (con.get() == null) { + Connection c = dataSource.getConnection(username, password); + ConnectionWrap cc = new ConnectionWrap(c); + con.set(cc); + + log.info("Got new DB connection: " + c); + } else + log.info("Using thread DB connection: " + con.get().getCon()); + + return con.get(); + } + + public void releaseConnection() { + if (con.get() != null) { + try { + con.get().realClose(); + + log.info("DB Connection released: " + con.get().getCon()); + } catch (SQLException e) { + log.warn("Failed to release DB connection", e); + } finally { + con.remove(); + } + } + } + + public void setDataSource(DataSource dataSource) { + this.dataSource = dataSource; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/db/ConnectionWrap.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/db/ConnectionWrap.java new file mode 100644 index 00000000..1927fdb9 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/db/ConnectionWrap.java @@ -0,0 +1,338 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.util.db; + +import java.sql.Array; +import java.sql.Blob; +import java.sql.CallableStatement; +import java.sql.Clob; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.NClob; +import java.sql.PreparedStatement; +import java.sql.SQLClientInfoException; +import java.sql.SQLException; +import java.sql.SQLWarning; +import java.sql.SQLXML; +import java.sql.Savepoint; +import java.sql.Statement; +import java.sql.Struct; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.Executor; + +public class ConnectionWrap implements Connection { + + private Connection cc; + + public ConnectionWrap(Connection cc) { + super(); + this.cc = cc; + } + + public Connection getCon() { + return cc; + } + + public void realClose() throws SQLException { + cc.close(); + } + + @Override + public T unwrap(Class iface) throws SQLException { + return cc.unwrap(iface); + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + return cc.isWrapperFor(iface); + } + + @Override + public Statement createStatement() throws SQLException { + return cc.createStatement(); + } + + @Override + public PreparedStatement prepareStatement(String sql) throws SQLException { + return cc.prepareStatement(sql); + } + + @Override + public CallableStatement prepareCall(String sql) throws SQLException { + return cc.prepareCall(sql); + } + + @Override + public String nativeSQL(String sql) throws SQLException { + return cc.nativeSQL(sql); + } + + @Override + public void setAutoCommit(boolean autoCommit) throws SQLException { + cc.setAutoCommit(autoCommit); + } + + @Override + public boolean getAutoCommit() throws SQLException { + return cc.getAutoCommit(); + } + + @Override + public void commit() throws SQLException { + cc.commit(); + } + + @Override + public void rollback() throws SQLException { + cc.rollback(); + } + + @Override + public void close() throws SQLException { + } + + @Override + public boolean isClosed() throws SQLException { + return cc.isClosed(); + } + + @Override + public DatabaseMetaData getMetaData() throws SQLException { + return cc.getMetaData(); + } + + @Override + public void setReadOnly(boolean readOnly) throws SQLException { + cc.setReadOnly(readOnly); + } + + @Override + public boolean isReadOnly() throws SQLException { + return cc.isReadOnly(); + } + + @Override + public void setCatalog(String catalog) throws SQLException { + cc.setCatalog(catalog); + } + + @Override + public String getCatalog() throws SQLException { + return cc.getCatalog(); + } + + @Override + public void setTransactionIsolation(int level) throws SQLException { + cc.setTransactionIsolation(level); + } + + @Override + public int getTransactionIsolation() throws SQLException { + return cc.getTransactionIsolation(); + } + + @Override + public SQLWarning getWarnings() throws SQLException { + return cc.getWarnings(); + } + + @Override + public void clearWarnings() throws SQLException { + cc.clearWarnings(); + } + + @Override + public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { + return cc.createStatement(resultSetType, resultSetConcurrency); + } + + @Override + public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) + throws SQLException { + return cc.prepareStatement(sql, resultSetType, resultSetConcurrency); + } + + @Override + public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { + return cc.prepareCall(sql, resultSetType, resultSetConcurrency); + } + + @Override + public Map> getTypeMap() throws SQLException { + return cc.getTypeMap(); + } + + @Override + public void setTypeMap(Map> map) throws SQLException { + cc.setTypeMap(map); + } + + @Override + public void setHoldability(int holdability) throws SQLException { + cc.setHoldability(holdability); + } + + @Override + public int getHoldability() throws SQLException { + return cc.getHoldability(); + } + + @Override + public Savepoint setSavepoint() throws SQLException { + return cc.setSavepoint(); + } + + @Override + public Savepoint setSavepoint(String name) throws SQLException { + return cc.setSavepoint(name); + } + + @Override + public void rollback(Savepoint savepoint) throws SQLException { + cc.rollback(savepoint); + } + + @Override + public void releaseSavepoint(Savepoint savepoint) throws SQLException { + cc.releaseSavepoint(savepoint); + } + + @Override + public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) + throws SQLException { + return cc.createStatement(resultSetType, resultSetConcurrency, resultSetHoldability); + } + + @Override + public PreparedStatement prepareStatement( + String sql, + int resultSetType, + int resultSetConcurrency, + int resultSetHoldability) throws SQLException { + return cc.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability); + } + + @Override + public CallableStatement prepareCall( + String sql, + int resultSetType, + int resultSetConcurrency, + int resultSetHoldability) throws SQLException { + return cc.prepareCall(sql, resultSetType, resultSetConcurrency, resultSetHoldability); + } + + @Override + public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { + return cc.prepareStatement(sql, autoGeneratedKeys); + } + + @Override + public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { + return cc.prepareStatement(sql, columnIndexes); + } + + @Override + public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { + return cc.prepareStatement(sql, columnNames); + } + + @Override + public Clob createClob() throws SQLException { + return cc.createClob(); + } + + @Override + public Blob createBlob() throws SQLException { + return cc.createBlob(); + } + + @Override + public NClob createNClob() throws SQLException { + return cc.createNClob(); + } + + @Override + public SQLXML createSQLXML() throws SQLException { + return cc.createSQLXML(); + } + + @Override + public boolean isValid(int timeout) throws SQLException { + return cc.isValid(timeout); + } + + @Override + public void setClientInfo(String name, String value) throws SQLClientInfoException { + cc.setClientInfo(name, value); + } + + @Override + public void setClientInfo(Properties properties) throws SQLClientInfoException { + cc.setClientInfo(properties); + } + + @Override + public String getClientInfo(String name) throws SQLException { + return cc.getClientInfo(name); + } + + @Override + public Properties getClientInfo() throws SQLException { + return cc.getClientInfo(); + } + + @Override + public Array createArrayOf(String typeName, Object[] elements) throws SQLException { + return cc.createArrayOf(typeName, elements); + } + + @Override + public Struct createStruct(String typeName, Object[] attributes) throws SQLException { + return cc.createStruct(typeName, attributes); + } + + @Override + public void setSchema(String schema) throws SQLException { + cc.setSchema(schema); + } + + @Override + public String getSchema() throws SQLException { + return cc.getSchema(); + } + + @Override + public void abort(Executor executor) throws SQLException { + cc.abort(executor); + } + + @Override + public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException { + cc.setNetworkTimeout(executor, milliseconds); + } + + @Override + public int getNetworkTimeout() throws SQLException { + return cc.getNetworkTimeout(); + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/db/DataSourceWrap.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/db/DataSourceWrap.java new file mode 100644 index 00000000..d729e127 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/db/DataSourceWrap.java @@ -0,0 +1,98 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.util.db; + +import java.io.PrintWriter; +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; + +import javax.sql.DataSource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DataSourceWrap implements DataSource { + + private static final Logger log = LoggerFactory.getLogger(DataSourceWrap.class); + + private DataSource dataSource; + + @Override + public PrintWriter getLogWriter() throws SQLException { + return dataSource.getLogWriter(); + } + + @Override + public void setLogWriter(PrintWriter out) throws SQLException { + dataSource.setLogWriter(out); + } + + @Override + public void setLoginTimeout(int seconds) throws SQLException { + dataSource.setLoginTimeout(seconds); + } + + @Override + public int getLoginTimeout() throws SQLException { + return dataSource.getLoginTimeout(); + } + + @Override + public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedException { + return dataSource.getParentLogger(); + } + + @Override + public T unwrap(Class iface) throws SQLException { + return dataSource.unwrap(iface); + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + return dataSource.isWrapperFor(iface); + } + + @Override + public Connection getConnection() throws SQLException { + Connection c = dataSource.getConnection(); + + log.debug("getConnection: " + c.getClass().getName()); + + c.setAutoCommit(true); + return c; + } + + @Override + public Connection getConnection(String username, String password) throws SQLException { + Connection c = dataSource.getConnection(username, password); + + log.debug("getConnection: " + c.getClass().getName()); + + c.setAutoCommit(true); + return c; + } + + public void setDataSource(DataSource dataSource) { + this.dataSource = dataSource; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/expr/ExpressionEvaluator.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/expr/ExpressionEvaluator.java new file mode 100644 index 00000000..ff15d770 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/expr/ExpressionEvaluator.java @@ -0,0 +1,207 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.util.expr; + +import java.util.Map; + +public class ExpressionEvaluator { + + public static long evalLong(String expr, Map vars) { + return (long) evalFloat(expr, vars); + } + + public static float evalFloat(String expr, Map vars) { + expr = expr.trim(); + int sl = expr.length(); + if (sl == 0) + throw new IllegalArgumentException("Cannot interpret empty string."); + + // Remove parentheses if any + if (expr.charAt(0) == '(' && expr.charAt(sl - 1) == ')') + return evalFloat(expr.substring(1, sl - 1), vars); + + // Look for operators in the order of least priority + String[] sss = findOperator(expr, "-", true); + if (sss != null) + return evalFloat(sss[0], vars) - evalFloat(sss[1], vars); + + sss = findOperator(expr, "+", true); + if (sss != null) + return evalFloat(sss[0], vars) + evalFloat(sss[1], vars); + + sss = findOperator(expr, "/", true); + if (sss != null) + return evalFloat(sss[0], vars) / evalFloat(sss[1], vars); + + sss = findOperator(expr, "*", true); + if (sss != null) + return evalFloat(sss[0], vars) * evalFloat(sss[1], vars); + + // Check if expr is a number + try { + return Float.valueOf(expr); + } catch (Exception e) { + } + + // Must be a variable + Object v = vars.get(expr); + if (v != null) { + if (v instanceof Float) + return (Float) v; + if (v instanceof Long) + return (Long) v; + if (v instanceof Integer) + return (Integer) v; + } + return 0; + } + + public static boolean evalBoolean(String expr, Map vars) { + expr = expr.trim(); + int sl = expr.length(); + if (sl == 0) + throw new IllegalArgumentException("Cannot interpret empty string."); + + if (expr.equalsIgnoreCase("true")) + return true; + + if (expr.equalsIgnoreCase("false")) + return false; + + // Remove parentheses if any + if (expr.charAt(0) == '(' && expr.charAt(sl - 1) == ')') + return evalBoolean(expr.substring(1, sl - 1), vars); + + // Look for operators in the order of least priority + String[] sss = findOperator(expr, "or", true); + if (sss != null) + return evalBoolean(sss[0], vars) || evalBoolean(sss[1], vars); + + sss = findOperator(expr, "and", true); + if (sss != null) + return evalBoolean(sss[0], vars) && evalBoolean(sss[1], vars); + + sss = findOperator(expr, "not", true); + if (sss != null) + return !evalBoolean(sss[1], vars); + + sss = findOperator(expr, "!=", false); + if (sss == null) + sss = findOperator(expr, "<>", false); + if (sss != null) + return evalLong(sss[0], vars) != evalLong(sss[1], vars); + + sss = findOperator(expr, "==", false); + if (sss == null) + sss = findOperator(expr, "=", false); + if (sss != null) + return evalLong(sss[0], vars) == evalLong(sss[1], vars); + + sss = findOperator(expr, ">=", false); + if (sss != null) + return evalLong(sss[0], vars) >= evalLong(sss[1], vars); + + sss = findOperator(expr, ">", false); + if (sss != null) + return evalLong(sss[0], vars) > evalLong(sss[1], vars); + + sss = findOperator(expr, "<=", false); + if (sss != null) + return evalLong(sss[0], vars) <= evalLong(sss[1], vars); + + sss = findOperator(expr, "<", false); + if (sss != null) + return evalLong(sss[0], vars) < evalLong(sss[1], vars); + + throw new IllegalArgumentException("Cannot interpret '" + expr + "': Invalid expression."); + } + + private static String[] findOperator(String s, String op, boolean delimiterRequired) { + int opl = op.length(); + int sl = s.length(); + String delimiters = " \0\t\r\n()"; + int pcount = 0, qcount = 0; + for (int i = 0; i < sl; i++) { + char c = s.charAt(i); + if (c == '(' && qcount == 0) + pcount++; + else if (c == ')' && qcount == 0) { + pcount--; + if (pcount < 0) + throw new IllegalArgumentException("Cannot interpret '" + s + "': Parentheses do not match."); + } else if (c == '\'') + qcount = (qcount + 1) % 2; + else if (i <= sl - opl && pcount == 0 && qcount == 0) { + String ss = s.substring(i, i + opl); + if (ss.equalsIgnoreCase(op)) { + boolean found = true; + if (delimiterRequired) { + // Check for delimiter before and after to make sure it is not part of another word + char chbefore = '\0'; + if (i > 0) + chbefore = s.charAt(i - 1); + char chafter = '\0'; + if (i < sl - opl) + chafter = s.charAt(i + opl); + found = delimiters.indexOf(chbefore) >= 0 && delimiters.indexOf(chafter) >= 0; + } + if (found) { + // We've found the operator, split the string + String[] sss = new String[2]; + sss[0] = s.substring(0, i); + sss[1] = s.substring(i + opl); + return sss; + } + } + } + } + if (pcount > 0) + throw new IllegalArgumentException("Cannot interpret '" + s + "': Parentheses do not match."); + if (qcount > 0) + throw new IllegalArgumentException("Cannot interpret '" + s + "': No closing '."); + return null; + } + + private static Object parseObject(String s) { + s = s.trim(); + int sl = s.length(); + if (sl == 0) + throw new IllegalArgumentException("Cannot interpret empty string."); + if (s.equalsIgnoreCase("null")) + return null; + if (s.charAt(0) == '\'') { + if (sl < 2 || s.charAt(sl - 1) != '\'') + throw new IllegalArgumentException("Cannot interpret '" + s + "': No closing '."); + return s.substring(1, sl - 1); + } + // Not in quotes - must be a number + try { + return Long.valueOf(s); + } catch (Exception e) { + } + try { + return Double.valueOf(s); + } catch (Exception e) { + throw new IllegalArgumentException("Cannot interpret '" + s + "': Invalid number."); + } + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/speed/SpeedUtil.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/speed/SpeedUtil.java new file mode 100644 index 00000000..8a0b006b --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/speed/SpeedUtil.java @@ -0,0 +1,41 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.util.speed; + +public class SpeedUtil { + + private long unitFactor = 1000; + + public long convertToKbps(long maxSpeed, String unit) { + if (unit.equalsIgnoreCase("kbps")) + return maxSpeed; + if (unit.equalsIgnoreCase("Mbps")) + return maxSpeed * unitFactor; + if (unit.equalsIgnoreCase("Gbps")) + return maxSpeed * unitFactor * unitFactor; + return 0; + } + + public void setUnitFactor(long unitFactor) { + this.unitFactor = unitFactor; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/str/StrUtil.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/str/StrUtil.java new file mode 100644 index 00000000..02857e10 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/str/StrUtil.java @@ -0,0 +1,305 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.util.str; + +import java.lang.reflect.Array; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.SortedSet; +import java.util.TreeSet; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class StrUtil { + + private static final Logger log = LoggerFactory.getLogger(StrUtil.class); + + public static final String INDENT_STR = " "; + + public static void indent(StringBuilder ss, int ind) { + for (int i = 0; i < ind; i++) + ss.append(INDENT_STR); + } + + public static void info(Logger log, Object o) { + if (log.isInfoEnabled()) { + StringBuilder ss = new StringBuilder(); + struct(ss, o); + log.info(ss.toString()); + } + } + + public static void debug(Logger log, Object o) { + if (log.isDebugEnabled()) { + StringBuilder ss = new StringBuilder(); + struct(ss, o); + log.debug(ss.toString()); + } + } + + public static void struct(StringBuilder ss, Object o) { + struct(ss, o, 0); + } + + public static void struct(StringBuilder ss, Object o, int ind) { + if (o == null) { + ss.append("null"); + return; + } + + if (isSimple(o)) { + ss.append(o); + return; + } + + Class cls = o.getClass(); + + if (cls.isEnum()) { + ss.append(o); + return; + } + + if (cls.isArray()) { + int n = Array.getLength(o); + if (n == 0) { + ss.append("[]"); + return; + } + + Object o1 = Array.get(o, 0); + if (isSimple(o1)) { + ss.append('[').append(o1); + for (int i = 1; i < n; i++) { + o1 = Array.get(o, i); + ss.append(", ").append(o1); + } + ss.append(']'); + return; + } + + ss.append('\n'); + indent(ss, ind + 1); + ss.append('['); + struct(ss, o1, ind + 1); + for (int i = 1; i < n; i++) { + o1 = Array.get(o, i); + struct(ss, o1, ind + 1); + } + ss.append('\n'); + indent(ss, ind + 1); + ss.append(']'); + return; + } + + if (o instanceof Collection) { + Collection ll = (Collection) o; + + int n = ll.size(); + if (n == 0) { + ss.append("[]"); + return; + } + + Iterator ii = ll.iterator(); + Object o1 = ii.next(); + if (isSimple(o1)) { + ss.append('[').append(o1); + while (ii.hasNext()) { + o1 = ii.next(); + ss.append(", ").append(o1); + } + ss.append(']'); + return; + } + + ss.append('\n'); + indent(ss, ind + 1); + ss.append('['); + struct(ss, o1, ind + 1); + while (ii.hasNext()) { + o1 = ii.next(); + struct(ss, o1, ind + 1); + } + ss.append('\n'); + indent(ss, ind + 1); + ss.append(']'); + return; + + } + + if (o instanceof Map) { + Map mm = (Map) o; + + int n = mm.size(); + if (n == 0) { + ss.append("{}"); + return; + } + + ss.append('{'); + + for (Object k : mm.keySet()) { + ss.append('\n'); + indent(ss, ind + 1); + ss.append(k).append(": "); + + Object o1 = mm.get(k); + struct(ss, o1, ind + 2); + } + + ss.append('\n'); + indent(ss, ind); + ss.append('}'); + + return; + } + + Field[] fields = cls.getFields(); + + if (fields.length == 0) { + ss.append(o); + return; + } + + ss.append('\n'); + indent(ss, ind + 1); + ss.append('<').append(cls.getSimpleName()).append("> {"); + for (Field f : fields) { + ss.append('\n'); + indent(ss, ind + 2); + ss.append(f.getName()).append(": "); + Object v = null; + try { + v = f.get(o); + } catch (IllegalAccessException e) { + v = "*** Cannot obtain value *** : " + e.getMessage(); + } + struct(ss, v, ind + 2); + } + ss.append('\n'); + indent(ss, ind + 1); + ss.append('}'); + } + + public static SortedSet listInt(String ss, String warning) { + if (ss == null || ss.length() == 0) + return null; + + SortedSet ll = new TreeSet(); + String[] str = ss.split(","); + for (String s : str) { + try { + int i1 = s.indexOf('-'); + int start, end; + if (i1 > 0) { + String s1 = s.substring(0, i1); + String s2 = s.substring(i1 + 1); + start = Integer.parseInt(s1); + end = Integer.parseInt(s2); + } else + start = end = Integer.parseInt(s); + for (int i = start; i <= end; i++) + ll.add(i); + } catch (NumberFormatException e) { + // Skip this - bad data in DB + log.warn(warning + " [" + s + "].", e); + } + } + return ll; + } + + public static String listInt(SortedSet ll) { + if (ll == null || ll.size() == 0) + return null; + + StringBuilder sb = new StringBuilder(2000); + Iterator i = ll.iterator(); + int n = i.next(); + int start = n; + int end = n; + boolean first = true; + while (i.hasNext()) { + n = i.next(); + if (n != end + 1) { + if (!first) + sb.append(','); + first = false; + + if (start == end) + sb.append(start); + else if (start == end - 1) + sb.append(start).append(',').append(end); + else + sb.append(start).append('-').append(end); + + start = n; + } + end = n; + } + + if (!first) + sb.append(','); + + if (start == end) + sb.append(start); + else if (start == end - 1) + sb.append(start).append(',').append(end); + else + sb.append(start).append('-').append(end); + + return sb.toString(); + } + + public static List listStr(String s) { + if (s == null || s.length() == 0) + return null; + String[] ss = s.split(","); + return Arrays.asList(ss); + } + + public static String listStr(Collection ll) { + if (ll == null || ll.isEmpty()) + return null; + StringBuilder ss = new StringBuilder(1000); + Iterator i = ll.iterator(); + ss.append(i.next()); + while (i.hasNext()) + ss.append(',').append(i.next()); + return ss.toString(); + } + + private static boolean isSimple(Object o) { + if (o == null) + return true; + + if (o instanceof Number || o instanceof String || o instanceof Boolean || o instanceof Date) + return true; + + return false; + } +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/vrf/VpnParam.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/vrf/VpnParam.java new file mode 100644 index 00000000..a9d69507 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/vrf/VpnParam.java @@ -0,0 +1,30 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.util.vrf; + +public class VpnParam { + + public String vpnId; + public String siteType; + public String spokeServiceInstanceId; + public String routeGroupName; +} diff --git a/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/vrf/VrfUtil.java b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/vrf/VrfUtil.java new file mode 100644 index 00000000..d5a691bb --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/vrf/VrfUtil.java @@ -0,0 +1,76 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.util.vrf; + +public class VrfUtil { + + public static String createVrfInstanceName( + String serviceInstanceId, + String vpnId, + String siteType, + String routeGroup) { + if (vpnId == null || vpnId.trim().length() == 0) + return null; + + String ss = "VPN-" + vpnId; + if (siteType != null && siteType.equalsIgnoreCase("hub")) + ss += "-HUB"; + if (siteType != null && siteType.equalsIgnoreCase("spoke")) + ss += "-SP-" + serviceInstanceId; + if (routeGroup != null && routeGroup.trim().length() > 0) + ss += "-RG-" + routeGroup; + + return ss; + } + + public static VpnParam parseVrfInstanceName(String vrfInstanceName) { + VpnParam vpnParam = new VpnParam(); + + int i1 = vrfInstanceName.indexOf("-HUB"); + if (i1 > 0) + vpnParam.siteType = "HUB"; + + int i2 = vrfInstanceName.indexOf("-SP-"); + if (i2 > 0) + vpnParam.siteType = "SPOKE"; + + int i3 = vrfInstanceName.indexOf("-RG-"); + if (i3 > 0) + vpnParam.routeGroupName = vrfInstanceName.substring(i3 + 4); + + int i4 = vrfInstanceName.length(); + if (i1 > 0) + i4 = i1; + else if (i2 > 0) + i4 = i2; + else if (i3 > 0) + i4 = i3; + vpnParam.vpnId = vrfInstanceName.substring(4, i4); + + if (i2 > 0 && i3 < 0) + vpnParam.spokeServiceInstanceId = vrfInstanceName.substring(i2 + 4); + if (i2 > 0 && i3 > 0) + vpnParam.spokeServiceInstanceId = vrfInstanceName.substring(i2 + 4, i3); + + return vpnParam; + } +} diff --git a/resource-assignment/provider/src/main/resources/META-INF/spring/resource-assignment-context.xml b/resource-assignment/provider/src/main/resources/META-INF/spring/resource-assignment-context.xml new file mode 100644 index 00000000..b123944d --- /dev/null +++ b/resource-assignment/provider/src/main/resources/META-INF/spring/resource-assignment-context.xml @@ -0,0 +1,296 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resource-assignment/provider/src/main/resources/META-INF/spring/resource-assignment-osgi-context.xml b/resource-assignment/provider/src/main/resources/META-INF/spring/resource-assignment-osgi-context.xml new file mode 100644 index 00000000..bec30ce1 --- /dev/null +++ b/resource-assignment/provider/src/main/resources/META-INF/spring/resource-assignment-osgi-context.xml @@ -0,0 +1,39 @@ + + + + + + + + javax.sql.DataSource + org.openecomp.sdnc.sli.resource.dblib.DbLibService + + + + + + diff --git a/resource-assignment/provider/src/main/resources/resource-allocator.properties b/resource-assignment/provider/src/main/resources/resource-allocator.properties new file mode 100644 index 00000000..1a2cf0c7 --- /dev/null +++ b/resource-assignment/provider/src/main/resources/resource-allocator.properties @@ -0,0 +1,26 @@ +### +# ============LICENSE_START======================================================= +# openECOMP : SDN-C +# ================================================================================ +# Copyright (C) 2017 ONAP 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========================================================= +### + +org.openecomp.sdnc.sli.dbtype = jdbc +org.openecomp.sdnc.sli.jdbc.url = jdbc:mysql://dbhost:3306/sdnctl +org.openecomp.sdnc.sli.jdbc.database = sdnctl +org.openecomp.sdnc.sli.jdbc.user = sdnctl +org.openecomp.sdnc.sli.jdbc.password = gamma diff --git a/resource-assignment/provider/src/main/resources/sql/001_resource_rule_ddl.sql b/resource-assignment/provider/src/main/resources/sql/001_resource_rule_ddl.sql new file mode 100644 index 00000000..ea60c62d --- /dev/null +++ b/resource-assignment/provider/src/main/resources/sql/001_resource_rule_ddl.sql @@ -0,0 +1,32 @@ +--- +-- ============LICENSE_START======================================================= +-- openECOMP : SDN-C +-- ================================================================================ +-- Copyright (C) 2017 ONAP 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========================================================= +--- + +CREATE TABLE resource_rule ( + resource_rule_id SERIAL PRIMARY KEY, + resource_name VARCHAR(50) NOT NULL, + end_point_position VARCHAR(50) NOT NULL, + service_expression VARCHAR(2000) NOT NULL, + equipment_level VARCHAR(50) NOT NULL, + equipment_expression VARCHAR(2000) NOT NULL, + allocation_expression VARCHAR(2000) NOT NULL, + soft_limit_expression VARCHAR(2000) NOT NULL, + hard_limit_expression VARCHAR(2000) NOT NULL +); diff --git a/resource-assignment/provider/src/main/resources/sql/002_max_port_speed_ddl.sql b/resource-assignment/provider/src/main/resources/sql/002_max_port_speed_ddl.sql new file mode 100644 index 00000000..2aa66ac8 --- /dev/null +++ b/resource-assignment/provider/src/main/resources/sql/002_max_port_speed_ddl.sql @@ -0,0 +1,29 @@ +--- +-- ============LICENSE_START======================================================= +-- openECOMP : SDN-C +-- ================================================================================ +-- Copyright (C) 2017 ONAP 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========================================================= +--- + +CREATE TABLE max_port_speed ( + max_port_speed_id SERIAL PRIMARY KEY, + image_file_name VARCHAR(50) NOT NULL, + end_point_position VARCHAR(50) NOT NULL, + interface_name VARCHAR(100) NOT NULL, + max_speed BIGINT NOT NULL, + unit VARCHAR(10) NOT NULL +); diff --git a/resource-assignment/provider/src/main/resources/sql/003_max_server_speed_ddl.sql b/resource-assignment/provider/src/main/resources/sql/003_max_server_speed_ddl.sql new file mode 100644 index 00000000..671117e7 --- /dev/null +++ b/resource-assignment/provider/src/main/resources/sql/003_max_server_speed_ddl.sql @@ -0,0 +1,28 @@ +--- +-- ============LICENSE_START======================================================= +-- openECOMP : SDN-C +-- ================================================================================ +-- Copyright (C) 2017 ONAP 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========================================================= +--- + +CREATE TABLE max_server_speed ( + max_server_speed_id SERIAL PRIMARY KEY, + server_model VARCHAR(50) NOT NULL, + evc_count SMALLINT NOT NULL, + max_speed BIGINT NOT NULL, + unit VARCHAR(10) NOT NULL +); diff --git a/resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/DataSetup.java b/resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/DataSetup.java new file mode 100644 index 00000000..f74eeee5 --- /dev/null +++ b/resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/DataSetup.java @@ -0,0 +1,261 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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 jtest.org.openecomp.sdnc.ra; + +import java.util.Date; + +import jtest.util.org.openecomp.sdnc.ra.TestDb; +import jtest.util.org.openecomp.sdnc.ra.TestTable; + +public class DataSetup { + + private TestDb testDb; + + private TestTable vpePool = null; + private TestTable vplspePool = null; + private TestTable pserver = null; + private TestTable serviceResource = null; + private TestTable resource = null; + private TestTable allocationItem = null; + + private static final String[] VPE_POOL_COLUMNS = { + "vpe_name", "ipv4_oam_address", "loopback0_ipv4_address", "provisioning_status", "aic_site_id", + "availability_zone", "vlan_id_outer", "vendor", "physical_intf_name", "physical_intf_speed", + "physical_intf_units", "vpe_uuid", "vpe_id", "image_filename" }; + + private static final String[] VPLSPE_POOL_COLUMNS = { + "vplspe_name", "aic_site_id", "availability_zone", "physical_intf_name", "physical_intf_speed", + "physical_intf_units", "loopback0_ipv4_address", "vlan_id_outer", "vplspe_uuid", "image_filename", + "provisioning_status", "vendor" }; + + private static final String[] PSERVER_COLUMNS = { + "hostname", "ptnii_equip_name", "number_of_cpus", "disk_in_gigabytes", "ram_in_megabytes", "equip_type", + "equip_vendor", "equip_model", "fqdn", "pserver_selflink", "ipv4_oam_address", "serial_number", + "pserver_id", "internet_topology", "aic_site_id", "in_maint", "pserver_name2", "purpose" }; + + private static final String[] SERVICE_RESOURCE_COLUMNS = { + "service_instance_id", "service_status", "service_change_number", "resource_set_id", "resource_union_id" }; + + private static final String[] RESOURCE_COLUMNS = { "asset_id", "resource_name", "resource_type", "lt_used" }; + + private static final String[] ALLOCATION_ITEM_COLUMNS = { + "resource_id", "application_id", "resource_set_id", "resource_union_id", "resource_share_group_list", + "lt_used", "allocation_time" }; + + private void initTables() { + if (vpePool == null) + vpePool = testDb.table("VPE_POOL", "vpe_name", VPE_POOL_COLUMNS); + if (vplspePool == null) + vplspePool = testDb.table("VPLSPE_POOL", "vplspe_name", VPLSPE_POOL_COLUMNS); + if (pserver == null) + pserver = testDb.table("PSERVER", "hostname", PSERVER_COLUMNS); + if (serviceResource == null) + serviceResource = testDb.table("SERVICE_RESOURCE", "service_resource_id", SERVICE_RESOURCE_COLUMNS); + if (resource == null) + resource = testDb.table("RESOURCE", "resource_id", RESOURCE_COLUMNS); + if (allocationItem == null) + allocationItem = testDb.table("ALLOCATION_ITEM", "allocation_item_id", ALLOCATION_ITEM_COLUMNS); + } + + public void cleanup() { + initTables(); + vpePool.delete("true"); + vplspePool.delete("true"); + pserver.delete("true"); + serviceResource.delete("true"); + allocationItem.delete("true"); + resource.delete("true"); + } + + public void setupVpePort( + String aicSiteId, + String vpeId, + String interfaceName, + String provStatus, + String imageFileName) { + initTables(); + vpePool.add(vpeId, "127.0.0.1", "107.134.152.139", provStatus, aicSiteId, "mtanj-esx-az01", "3501", + "JUNIPER", interfaceName, "1", "GBPS", "vpe002", "VPESAT-auttx200me6", imageFileName); + } + + public void setupVplspePort( + String aicSiteId, + String vplspeId, + String interfaceName, + String provStatus, + String imageFileName) { + initTables(); + vplspePool.add(vplspeId, aicSiteId, "mtanj-esx-az01", interfaceName, "100", "GBPS", "192.168.119.32", "3501", + "vpls002", imageFileName, provStatus, "JUNIPER"); + } + + public void setupPserver(String hostname, String aicSiteId) { + initTables(); + pserver.add(hostname, hostname + "srv1", 4, 1000, 16000, "equip_type", "equip_vendor", "equip_model", "fqdn", + "pserver_selflink", "123.123.123.123", "serial_number", "pserver_id", "internet_topology", aicSiteId, + "N", hostname, "purpose"); + } + + public void setupService( + String serviceInstanceId, + String status, + int changeNumber, + long speedKbps, + String vpeId, + String vplspeId, + String serverId) { + initTables(); + + String resourceSetId = serviceInstanceId + "/" + changeNumber; + String resourceUnionId = serviceInstanceId; + + serviceResource.add(serviceInstanceId, status, changeNumber, resourceSetId, resourceUnionId); + + Long rid = resource.getId("asset_id = '" + vpeId + "/ae0' AND resource_name = 'Bandwidth'"); + if (rid == null) { + resource.add(vpeId + "/ae0", "Bandwidth", "Limit", 1); + rid = resource.getLastId(); + } + allocationItem.add(rid, "SDNC", resourceSetId, resourceUnionId, null, speedKbps, new Date()); + + rid = resource.getId("asset_id = '" + vplspeId + "' AND resource_name = 'Bandwidth'"); + if (rid == null) { + resource.add(vplspeId, "Bandwidth", "Limit", 1); + rid = resource.getLastId(); + } + allocationItem.add(rid, "SDNC", resourceSetId, resourceUnionId, null, speedKbps, new Date()); + + rid = resource.getId("asset_id = '" + serverId + "' AND resource_name = 'Bandwidth'"); + if (rid == null) { + resource.add(serverId, "Bandwidth", "Limit", 1); + rid = resource.getLastId(); + } + allocationItem.add(rid, "SDNC", resourceSetId, resourceUnionId, null, speedKbps, new Date()); + + rid = resource.getId("asset_id = '" + serverId + "' AND resource_name = 'Connection'"); + if (rid == null) { + resource.add(serverId, "Connection", "Limit", 1); + rid = resource.getLastId(); + } + allocationItem.add(rid, "SDNC", resourceSetId, resourceUnionId, null, 1, new Date()); + } + + public boolean serviceNotInDb(String serviceInstanceId, String status, Integer changeNumber) { + String where = "service_instance_id = '" + serviceInstanceId + "'"; + if (status != null) + where += " AND service_status = '" + status + "'"; + if (changeNumber != null) + where += " AND service_change_number = " + changeNumber; + + if (serviceResource.exists(where)) + return false; + + where = "resource_union_id = '" + serviceInstanceId + "'"; + if (changeNumber != null) + where += " AND resource_set_id = '" + serviceInstanceId + "/" + changeNumber + "'"; + + if (allocationItem.exists(where)) + return false; + + return true; + } + + public boolean serviceCorrectInDb(String serviceInstanceId, String status, int changeNumber, long speedKbps) { + String where = "service_instance_id = '" + serviceInstanceId + "' AND service_status = '" + status + + "' AND service_change_number = " + changeNumber; + if (!serviceResource.exists(where)) + return false; + + where = "resource_union_id = '" + serviceInstanceId + "' AND resource_set_id = '" + serviceInstanceId + "/" + + changeNumber + "' AND lt_used = " + speedKbps; + if (!allocationItem.exists(where)) + return false; + + return true; + } + + public boolean serviceCorrectInDb( + String vpeId, + String aicSiteId, + String serviceInstanceId, + String status, + int changeNumber, + long speedKbps) { + + String where = "service_instance_id = '" + serviceInstanceId + "' AND service_status = '" + status + + "' AND service_change_number = " + changeNumber; + if (!serviceResource.exists(where)) + return false; + + Long vpebwrid = resource.getId("asset_id = '" + vpeId + "/ae0' AND resource_name = 'Bandwidth'"); + if (vpebwrid == null) + return false; + + where = "resource_id = " + vpebwrid + " AND resource_union_id = '" + serviceInstanceId + + "' AND resource_set_id = '" + serviceInstanceId + "/" + changeNumber + "' AND lt_used = " + speedKbps; + if (!allocationItem.exists(where)) + return false; + + Long srvbwrid = resource.getId("asset_id = '" + aicSiteId + "/Server1' AND resource_name = 'Bandwidth'"); + if (srvbwrid == null) + return false; + + where = "resource_id = " + srvbwrid + " AND resource_union_id = '" + serviceInstanceId + + "' AND resource_set_id = '" + serviceInstanceId + "/" + changeNumber + "' AND lt_used = " + speedKbps; + if (!allocationItem.exists(where)) + return false; + + Long srvconrid = resource.getId("asset_id = '" + aicSiteId + "/Server1' AND resource_name = 'Connection'"); + if (srvconrid == null) + return false; + + where = "resource_id = " + srvconrid + " AND resource_union_id = '" + serviceInstanceId + + "' AND resource_set_id = '" + serviceInstanceId + "/" + changeNumber + "' AND lt_used = 1"; + if (!allocationItem.exists(where)) + return false; + + return true; + } + + public boolean serviceCorrectInDb( + String serviceInstanceId, + String endPointPosition, + String status, + int changeNumber, + long speedKbps) { + String where = "service_instance_id = '" + serviceInstanceId + "' AND service_status = '" + status + + "' AND service_change_number = " + changeNumber; + if (!serviceResource.exists(where)) + return false; + + where = "resource_union_id = '" + serviceInstanceId + "/" + endPointPosition + "' AND resource_set_id = '" + + serviceInstanceId + "/" + endPointPosition + "/" + changeNumber + "' AND lt_used = " + speedKbps; + if (!allocationItem.exists(where)) + return false; + + return true; + } + + public void setTestDb(TestDb testDb) { + this.testDb = testDb; + } +} diff --git a/resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/TestIsAvailable.java b/resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/TestIsAvailable.java new file mode 100644 index 00000000..7d57eba3 --- /dev/null +++ b/resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/TestIsAvailable.java @@ -0,0 +1,424 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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 jtest.org.openecomp.sdnc.ra; + +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.MethodSorters; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource.QueryStatus; +import org.openecomp.sdnc.ra.ResourceAllocator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { "classpath:test-context.xml" }) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class TestIsAvailable { + + private static final Logger log = LoggerFactory.getLogger(TestIsAvailable.class); + + @Autowired(required = true) + private ResourceAllocator resourceAllocator; + + @Autowired(required = true) + private DataSetup dataSetup; + + @Test + public void test001() throws Exception { + String t = "001"; + log.info("============== isAvailable " + t + " ================================"); + log.info("=== Test successful response - all resources available"); + + String service1 = "isAvailable" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "300"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.isAvailable("NetworkCapacity", null, null, ctx); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, null)); + } + + @Test + public void test002() throws Exception { + String t = "002"; + log.info("============== isAvailable " + t + " ================================"); + log.info("=== Test capacity not found - request very big number that is above the limits"); + + String service1 = "isAvailable" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "300"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Gbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.isAvailable("NetworkCapacity", null, null, ctx); + + String maxAvailableSpeed = ctx.getAttribute("tmp.resource-allocator-output.max-available-speed"); + String speedUnit = ctx.getAttribute("tmp.resource-allocator-output.speed-unit"); + + log.info("Result: " + st); + log.info(" tmp.resource-allocator-output.max-available-speed: " + maxAvailableSpeed); + log.info(" tmp.resource-allocator-output.speed-unit: " + speedUnit); + + Assert.assertTrue(st == QueryStatus.NOT_FOUND); + Assert.assertTrue(maxAvailableSpeed.equals("960000")); + Assert.assertTrue(speedUnit.equals("kbps")); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, null)); + } + + @Test + public void test003() throws Exception { + String t = "003"; + log.info("============== isAvailable " + t + " ================================"); + log.info("=== Test capacity not found - PROV check for VPE"); + + String service1 = "isAvailable" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "---", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "300"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.isAvailable("NetworkCapacity", null, null, ctx); + + String maxAvailableSpeed = ctx.getAttribute("tmp.resource-allocator-output.max-available-speed"); + String speedUnit = ctx.getAttribute("tmp.resource-allocator-output.speed-unit"); + + log.info("Result: " + st); + log.info(" tmp.resource-allocator-output.max-available-speed: " + maxAvailableSpeed); + log.info(" tmp.resource-allocator-output.speed-unit: " + speedUnit); + + Assert.assertTrue(st == QueryStatus.NOT_FOUND); + Assert.assertTrue(maxAvailableSpeed.equals("0")); + Assert.assertTrue(speedUnit.equals("kbps")); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, null)); + } + + @Test + public void test004() throws Exception { + String t = "004"; + log.info("============== isAvailable " + t + " ================================"); + log.info("=== Test capacity not found - PROV check for VPLSPE"); + + String service1 = "isAvailable" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "---", null); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "300"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.isAvailable("NetworkCapacity", null, null, ctx); + + String maxAvailableSpeed = ctx.getAttribute("tmp.resource-allocator-output.max-available-speed"); + String speedUnit = ctx.getAttribute("tmp.resource-allocator-output.speed-unit"); + + log.info("Result: " + st); + log.info(" tmp.resource-allocator-output.max-available-speed: " + maxAvailableSpeed); + log.info(" tmp.resource-allocator-output.speed-unit: " + speedUnit); + + Assert.assertTrue(st == QueryStatus.NOT_FOUND); + Assert.assertTrue(maxAvailableSpeed.equals("0")); + Assert.assertTrue(speedUnit.equals("kbps")); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, null)); + } + + @Test + public void test005() throws Exception { + String t = "005"; + log.info("============== isAvailable " + t + " ================================"); + log.info("=== Test capacity not found - VPE not found in DB"); + + String service1 = "isAvailable" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "300"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.isAvailable("NetworkCapacity", null, null, ctx); + + String maxAvailableSpeed = ctx.getAttribute("tmp.resource-allocator-output.max-available-speed"); + String speedUnit = ctx.getAttribute("tmp.resource-allocator-output.speed-unit"); + + log.info("Result: " + st); + log.info(" tmp.resource-allocator-output.max-available-speed: " + maxAvailableSpeed); + log.info(" tmp.resource-allocator-output.speed-unit: " + speedUnit); + + Assert.assertTrue(st == QueryStatus.NOT_FOUND); + Assert.assertTrue(maxAvailableSpeed.equals("0")); + Assert.assertTrue(speedUnit.equals("kbps")); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, null)); + } + + @Test + public void test006() throws Exception { + String t = "006"; + log.info("============== isAvailable " + t + " ================================"); + log.info("=== Test capacity not found - VPLSPE not found in DB"); + + String service1 = "isAvailable" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "300"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.isAvailable("NetworkCapacity", null, null, ctx); + + String maxAvailableSpeed = ctx.getAttribute("tmp.resource-allocator-output.max-available-speed"); + String speedUnit = ctx.getAttribute("tmp.resource-allocator-output.speed-unit"); + + log.info("Result: " + st); + log.info(" tmp.resource-allocator-output.max-available-speed: " + maxAvailableSpeed); + log.info(" tmp.resource-allocator-output.speed-unit: " + speedUnit); + + Assert.assertTrue(st == QueryStatus.NOT_FOUND); + Assert.assertTrue(maxAvailableSpeed.equals("0")); + Assert.assertTrue(speedUnit.equals("kbps")); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, null)); + } + + @Test + public void test007() throws Exception { + String t = "007"; + log.info("============== isAvailable " + t + " ================================"); + log.info("=== Test capacity not found - test max available speed calculation"); + + String service1 = "isAvailable" + t + "/service1"; + String existingService1 = "isAvailable" + t + "/existing-service1"; + String existingService2 = "isAvailable" + t + "/existing-service2"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv127", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupService(existingService1, "Active", 2, 200000, "mtanjrsv126", "mtsnj303vr1", + "MTSNJA4LCP1/Server1"); + dataSetup.setupService(existingService2, "Active", 3, 100000, "mtanjrsv127", "mtsnj303vr1", + "MTSNJA4LCP1/Server1"); + dataSetup.setupService(existingService2, "Pending", 4, 500000, "mtanjrsv127", "mtsnj303vr1", + "MTSNJA4LCP1/Server1"); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "300"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Gbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.isAvailable("NetworkCapacity", null, null, ctx); + + String maxAvailableSpeed = ctx.getAttribute("tmp.resource-allocator-output.max-available-speed"); + String speedUnit = ctx.getAttribute("tmp.resource-allocator-output.speed-unit"); + + log.info("Result: " + st); + log.info(" tmp.resource-allocator-output.max-available-speed: " + maxAvailableSpeed); + log.info(" tmp.resource-allocator-output.speed-unit: " + speedUnit); + + Assert.assertTrue(st == QueryStatus.NOT_FOUND); + Assert.assertTrue(maxAvailableSpeed.equals("260000")); + Assert.assertTrue(speedUnit.equals("kbps")); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, null)); + } + + @Test + public void test008() throws Exception { + String t = "008"; + log.info("============== isAvailable " + t + " ================================"); + log.info("=== Test capacity not found - test server limit depending on number of connections"); + + String service1 = "isAvailable" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv127", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + for (int i = 1; i <= 13; i++) + dataSetup.setupService("isAvailable" + t + "/existing-service" + i, "Active", 2, 20000, "mtanjrsv126", + "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "300"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Gbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.isAvailable("NetworkCapacity", null, null, ctx); + + String maxAvailableSpeed = ctx.getAttribute("tmp.resource-allocator-output.max-available-speed"); + String speedUnit = ctx.getAttribute("tmp.resource-allocator-output.speed-unit"); + + log.info("Result: " + st); + log.info(" tmp.resource-allocator-output.max-available-speed: " + maxAvailableSpeed); + log.info(" tmp.resource-allocator-output.speed-unit: " + speedUnit); + + Assert.assertTrue(st == QueryStatus.NOT_FOUND); + Assert.assertTrue(maxAvailableSpeed.equals("340000")); + Assert.assertTrue(speedUnit.equals("kbps")); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, null)); + } + + @Test + public void test009() throws Exception { + String t = "009"; + log.info("============== isAvailable " + t + " ================================"); + log.info("=== Test successful response - no service instance id in input - all resources available"); + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.speed", "300"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.isAvailable("NetworkCapacity", null, null, ctx); + + log.info("Result: " + st); + log.info(" tmp.resource-allocator-output.max-available-speed: " + + ctx.getAttribute("tmp.resource-allocator-output.max-available-speed")); + log.info(" tmp.resource-allocator-output.speed-unit: " + + ctx.getAttribute("tmp.resource-allocator-output.speed-unit")); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + } + + @Test + public void test010() throws Exception { + String t = "010"; + log.info("============== isAvailable " + t + " ================================"); + log.info("=== Test input validations - no aic-site-id in input"); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.speed", "300"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Gbps"); + + try { + resourceAllocator.isAvailable("NetworkCapacity", null, null, ctx); + } catch (SvcLogicException e) { + Assert.assertTrue(e.getMessage().equals( + "tmp.resource-allocator.aic-site-id is required in ResourceAllocator")); + return; + } + Assert.fail("SvcLogicException expected"); + } + + @Test + public void test011() throws Exception { + String t = "011"; + log.info("============== isAvailable " + t + " ================================"); + log.info("=== Test input validations - no speed in input"); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Gbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + try { + resourceAllocator.isAvailable("NetworkCapacity", null, null, ctx); + } catch (SvcLogicException e) { + Assert.assertTrue(e.getMessage().equals("tmp.resource-allocator.speed is required in ResourceAllocator")); + return; + } + Assert.fail("SvcLogicException expected"); + } + + @Test + public void test012() throws Exception { + String t = "012"; + log.info("============== isAvailable " + t + " ================================"); + log.info("=== Test input validations - speed not a number in input"); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.speed", "nnnnn"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Gbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + try { + resourceAllocator.isAvailable("NetworkCapacity", null, null, ctx); + } catch (SvcLogicException e) { + Assert.assertTrue(e.getMessage().equals("Invalid tmp.resource-allocator.speed. Must be a number.")); + return; + } + Assert.fail("SvcLogicException expected"); + } + + @Test + public void test013() throws Exception { + String t = "013"; + log.info("============== isAvailable " + t + " ================================"); + log.info("=== Test input validations - speed-unit missing in input"); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.speed", "300"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + try { + resourceAllocator.isAvailable("NetworkCapacity", null, null, ctx); + } catch (SvcLogicException e) { + Assert.assertTrue(e.getMessage().equals( + "tmp.resource-allocator.speed-unit is required in ResourceAllocator")); + return; + } + Assert.fail("SvcLogicException expected"); + } +} diff --git a/resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/TestQuery.java b/resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/TestQuery.java new file mode 100644 index 00000000..e69003a3 --- /dev/null +++ b/resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/TestQuery.java @@ -0,0 +1,85 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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 jtest.org.openecomp.sdnc.ra; + +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.MethodSorters; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource.QueryStatus; +import org.openecomp.sdnc.ra.ResourceAllocator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { "classpath:test-context.xml" }) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class TestQuery { + + private static final Logger log = LoggerFactory.getLogger(TestQuery.class); + + @Autowired(required = true) + private ResourceAllocator resourceAllocator; + + @Autowired(required = true) + private DataSetup dataSetup; + + @Test + public void test001() throws Exception { + String t = "001"; + log.info("============== query " + t + " ================================"); + log.info("=== Test reading assigned resources (subinterface-id, vlan-id-inner)"); + + String service1 = "ICOREPVC" + t + "-1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "New"); + ctx.setAttribute("tmp.resource-allocator.service-model", "L3AVPN-EVC"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "300"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + ctx.setAttribute("tmp.resource-allocator.vpn-id", "123"); + ctx.setAttribute("tmp.resource-allocator.vrf-required", "false"); + + QueryStatus st = resourceAllocator.reserve("NetworkCapacity", null, null, null, ctx); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceCorrectInDb(service1, "VPE-Cust", "Pending", 1, 300000)); + + st = resourceAllocator.query("NetworkCapacity", true, null, service1, "end-point", null, ctx); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertEquals(ctx.getAttribute("end-point.subinterface-id"), "100"); + Assert.assertEquals(ctx.getAttribute("end-point.vlan-id-inner"), "2"); + Assert.assertEquals(ctx.getAttribute("end-point.vpe-name"), "mtanjrsv126"); + Assert.assertEquals(ctx.getAttribute("end-point.affinity-link"), "1"); + } +} diff --git a/resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/TestRelease.java b/resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/TestRelease.java new file mode 100644 index 00000000..f2ee50fc --- /dev/null +++ b/resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/TestRelease.java @@ -0,0 +1,430 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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 jtest.org.openecomp.sdnc.ra; + +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.MethodSorters; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource.QueryStatus; +import org.openecomp.sdnc.ra.ResourceAllocator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { "classpath:test-context.xml" }) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class TestRelease { + + private static final Logger log = LoggerFactory.getLogger(TestRelease.class); + + @Autowired(required = true) + private ResourceAllocator resourceAllocator; + + @Autowired(required = true) + private DataSetup dataSetup; + + @Test + public void test001() throws Exception { + String t = "001"; + log.info("============== release " + t + " ================================"); + log.info("=== Test release - cancel - new start"); + + String service1 = "release" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupService(service1, "Pending", 2, 200000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + Assert.assertTrue(dataSetup.serviceCorrectInDb(service1, "Pending", 2, 200000)); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Cancel"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + + QueryStatus st = resourceAllocator.release("NetworkCapacity", null, ctx); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, null)); + } + + @Test + public void test002() throws Exception { + String t = "002"; + log.info("============== release " + t + " ================================"); + log.info("=== Test release - cancel - change"); + + String service1 = "release" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupService(service1, "Active", 2, 200000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + dataSetup.setupService(service1, "Pending", 3, 400000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + Assert.assertTrue(dataSetup.serviceCorrectInDb(service1, "Active", 2, 200000)); + Assert.assertTrue(dataSetup.serviceCorrectInDb(service1, "Pending", 3, 400000)); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Cancel"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + + QueryStatus st = resourceAllocator.release("NetworkCapacity", null, ctx); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceCorrectInDb(service1, "Active", 2, 200000)); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, 3)); + } + + @Test + public void test003() throws Exception { + String t = "003"; + log.info("============== release " + t + " ================================"); + log.info("=== Test release - cancel - active there, but no pending - should do nothing and return success"); + + String service1 = "release" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupService(service1, "Active", 2, 200000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + Assert.assertTrue(dataSetup.serviceCorrectInDb(service1, "Active", 2, 200000)); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Cancel"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + + QueryStatus st = resourceAllocator.release("NetworkCapacity", null, ctx); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceCorrectInDb(service1, "Active", 2, 200000)); + } + + @Test + public void test004() throws Exception { + String t = "004"; + log.info("============== release " + t + " ================================"); + log.info("=== Test release - cancel - nothing in DB - should return success"); + + String service1 = "release" + t + "/service1"; + + dataSetup.cleanup(); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Cancel"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + + QueryStatus st = resourceAllocator.release("NetworkCapacity", null, ctx); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, null)); + } + + @Test + public void test005() throws Exception { + String t = "005"; + log.info("============== release " + t + " ================================"); + log.info("=== Test release - activate - new start"); + + String service1 = "release" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupService(service1, "Pending", 2, 200000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + Assert.assertTrue(dataSetup.serviceCorrectInDb(service1, "Pending", 2, 200000)); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Activate"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + + QueryStatus st = resourceAllocator.release("NetworkCapacity", null, ctx); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceCorrectInDb(service1, "Active", 2, 200000)); + } + + @Test + public void test006() throws Exception { + String t = "006"; + log.info("============== release " + t + " ================================"); + log.info("=== Test release - actovate - change"); + + String service1 = "release" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupService(service1, "Active", 2, 200000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + dataSetup.setupService(service1, "Pending", 3, 400000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + Assert.assertTrue(dataSetup.serviceCorrectInDb(service1, "Active", 2, 200000)); + Assert.assertTrue(dataSetup.serviceCorrectInDb(service1, "Pending", 3, 400000)); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Activate"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + + QueryStatus st = resourceAllocator.release("NetworkCapacity", null, ctx); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceCorrectInDb(service1, "Active", 3, 400000)); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, 2)); + } + + @Test + public void test007() throws Exception { + String t = "007"; + log.info("============== release " + t + " ================================"); + log.info("=== Test release - activate - active there, but no pending - should do nothing and return success"); + + String service1 = "release" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupService(service1, "Active", 2, 200000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + Assert.assertTrue(dataSetup.serviceCorrectInDb(service1, "Active", 2, 200000)); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Activate"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + + QueryStatus st = resourceAllocator.release("NetworkCapacity", null, ctx); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceCorrectInDb(service1, "Active", 2, 200000)); + } + + @Test + public void test008() throws Exception { + String t = "008"; + log.info("============== release " + t + " ================================"); + log.info("=== Test release - activate - nothing in DB - should return success"); + + String service1 = "release" + t + "/service1"; + + dataSetup.cleanup(); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Activate"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + + QueryStatus st = resourceAllocator.release("NetworkCapacity", null, ctx); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, null)); + } + + @Test + public void test009() throws Exception { + String t = "009"; + log.info("============== release " + t + " ================================"); + log.info("=== Test release - disconnect - only pending in DB"); + + String service1 = "release" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupService(service1, "Pending", 2, 200000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + Assert.assertTrue(dataSetup.serviceCorrectInDb(service1, "Pending", 2, 200000)); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Disconnect"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + + QueryStatus st = resourceAllocator.release("NetworkCapacity", null, ctx); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, null)); + } + + @Test + public void test010() throws Exception { + String t = "010"; + log.info("============== release " + t + " ================================"); + log.info("=== Test release - disconnect - only active in DB"); + + String service1 = "release" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupService(service1, "Active", 2, 200000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + Assert.assertTrue(dataSetup.serviceCorrectInDb(service1, "Active", 2, 200000)); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Disconnect"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + + QueryStatus st = resourceAllocator.release("NetworkCapacity", null, ctx); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, null)); + } + + @Test + public void test011() throws Exception { + String t = "011"; + log.info("============== release " + t + " ================================"); + log.info("=== Test release - disconnect - both active and pending in DB"); + + String service1 = "release" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupService(service1, "Active", 2, 200000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + dataSetup.setupService(service1, "Pending", 3, 400000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + Assert.assertTrue(dataSetup.serviceCorrectInDb(service1, "Active", 2, 200000)); + Assert.assertTrue(dataSetup.serviceCorrectInDb(service1, "Pending", 3, 400000)); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Disconnect"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + + QueryStatus st = resourceAllocator.release("NetworkCapacity", null, ctx); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, null)); + } + + @Test + public void test012() throws Exception { + String t = "012"; + log.info("============== release " + t + " ================================"); + log.info("=== Test release - disconnect - nothing in DB - should return success"); + + String service1 = "release" + t + "/service1"; + + dataSetup.cleanup(); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Disconnect"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + + QueryStatus st = resourceAllocator.release("NetworkCapacity", null, ctx); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, null)); + } + + @Test + public void test013() throws Exception { + String t = "013"; + log.info("============== release " + t + " ================================"); + log.info("=== Test input validations - request-type missing in input"); + + String service1 = "release" + t + "/service1"; + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + + try { + resourceAllocator.release("NetworkCapacity", null, ctx); + } catch (SvcLogicException e) { + Assert.assertTrue(e.getMessage().equals( + "tmp.resource-allocator.request-type is required in ResourceAllocator")); + return; + } + Assert.fail("SvcLogicException expected"); + } + + @Test + public void test014() throws Exception { + String t = "014"; + log.info("============== release " + t + " ================================"); + log.info("=== Test input validations - invalid request-type in input"); + + String service1 = "release" + t + "/service1"; + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "xxxxx"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + + try { + resourceAllocator.release("NetworkCapacity", null, ctx); + } catch (SvcLogicException e) { + Assert.assertTrue(e.getMessage().equals( + "Invalid tmp.resource-allocator.request-type: xxxxx. Supported values are Cancel, Activate, Disconnect.")); + return; + } + Assert.fail("SvcLogicException expected"); + } + + @Test + public void test015() throws Exception { + String t = "015"; + log.info("============== release " + t + " ================================"); + log.info("=== Test input validations - missing service-instance-id in input"); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Cancel"); + + try { + resourceAllocator.release("NetworkCapacity", null, ctx); + } catch (SvcLogicException e) { + Assert.assertTrue(e.getMessage().equals( + "tmp.resource-allocator.service-instance-id is required in ResourceAllocator")); + return; + } + Assert.fail("SvcLogicException expected"); + } +} diff --git a/resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/TestReserve.java b/resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/TestReserve.java new file mode 100644 index 00000000..08c67358 --- /dev/null +++ b/resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/TestReserve.java @@ -0,0 +1,681 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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 jtest.org.openecomp.sdnc.ra; + +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.MethodSorters; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource.QueryStatus; +import org.openecomp.sdnc.ra.ResourceAllocator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { "classpath:test-context.xml" }) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class TestReserve { + + private static final Logger log = LoggerFactory.getLogger(TestReserve.class); + + @Autowired(required = true) + private ResourceAllocator resourceAllocator; + + @Autowired(required = true) + private DataSetup dataSetup; + + @Test + public void test001() throws Exception { + String t = "001"; + log.info("============== reserve " + t + " ================================"); + log.info("=== Test successful response - new start - all resources available"); + + String service1 = "reserve" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupPserver("server1", "MTSNJA4LCP1"); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "New"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "300"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.reserve("NetworkCapacity", null, null, null, ctx); + + log.info("Result: " + st); + log.info(" tmp.resource-allocator-output.max-available-speed: " + + ctx.getAttribute("tmp.resource-allocator-output.max-available-speed")); + log.info(" tmp.resource-allocator-output.speed-unit: " + + ctx.getAttribute("tmp.resource-allocator-output.speed-unit")); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Pending", 1, 300000)); + } + + @Test + public void test002() throws Exception { + String t = "002"; + log.info("============== reserve " + t + " ================================"); + log.info("=== Test successful response - new start supp - all resources available"); + + String service1 = "reserve" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupService(service1, "Pending", 2, 200000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Pending", 2, 200000)); + + SvcLogicContext ctx = new SvcLogicContext(); + // ctx.setAttribute("tmp.resource-allocator.request-type", "New"); - Default is New + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "400"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.reserve("NetworkCapacity", null, null, null, ctx); + + log.info("Result: " + st); + log.info(" tmp.resource-allocator-output.max-available-speed: " + + ctx.getAttribute("tmp.resource-allocator-output.max-available-speed")); + log.info(" tmp.resource-allocator-output.speed-unit: " + + ctx.getAttribute("tmp.resource-allocator-output.speed-unit")); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Pending", 3, 400000)); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, 2)); + } + + @Test + public void test003() throws Exception { + String t = "003"; + log.info("============== reserve " + t + " ================================"); + log.info("=== Test successful response - change - all resources available"); + + String service1 = "reserve" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupService(service1, "Active", 2, 200000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Active", 2, 200000)); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Change"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "400"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.reserve("NetworkCapacity", null, null, null, ctx); + + log.info("Result: " + st); + log.info(" tmp.resource-allocator-output.max-available-speed: " + + ctx.getAttribute("tmp.resource-allocator-output.max-available-speed")); + log.info(" tmp.resource-allocator-output.speed-unit: " + + ctx.getAttribute("tmp.resource-allocator-output.speed-unit")); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Active", 2, 200000)); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Pending", 3, 400000)); + } + + @Test + public void test004() throws Exception { + String t = "004"; + log.info("============== reserve " + t + " ================================"); + log.info("=== Test successful response - change supp - all resources available"); + + String service1 = "reserve" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupService(service1, "Active", 2, 200000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + dataSetup.setupService(service1, "Pending", 3, 400000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Active", 2, 200000)); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Pending", 3, 400000)); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Change"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "500"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.reserve("NetworkCapacity", null, null, null, ctx); + + log.info("Result: " + st); + log.info(" tmp.resource-allocator-output.max-available-speed: " + + ctx.getAttribute("tmp.resource-allocator-output.max-available-speed")); + log.info(" tmp.resource-allocator-output.speed-unit: " + + ctx.getAttribute("tmp.resource-allocator-output.speed-unit")); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Active", 2, 200000)); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Pending", 4, 500000)); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, 3)); + } + + @Test + public void test005() throws Exception { + String t = "005"; + log.info("============== reserve " + t + " ================================"); + log.info("=== Test successful response - change - check that hard limits are applied, not soft for change"); + + String service1 = "reserve" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupService(service1, "Active", 2, 200000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Active", 2, 200000)); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Change"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "1200000"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "kbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.reserve("NetworkCapacity", null, null, null, ctx); + + log.info("Result: " + st); + log.info(" tmp.resource-allocator-output.max-available-speed: " + + ctx.getAttribute("tmp.resource-allocator-output.max-available-speed")); + log.info(" tmp.resource-allocator-output.speed-unit: " + + ctx.getAttribute("tmp.resource-allocator-output.speed-unit")); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Active", 2, 200000)); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Pending", 3, 1200000)); + } + + @Test + public void test006() throws Exception { + String t = "006"; + log.info("============== reserve " + t + " ================================"); + log.info("=== Test capacity not found - new start"); + + String service1 = "reserve" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "New"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "300"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Gbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.reserve("NetworkCapacity", null, null, null, ctx); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.NOT_FOUND); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, null)); + } + + @Test + public void test007() throws Exception { + String t = "007"; + log.info("============== reserve " + t + " ================================"); + log.info("=== Test capacity not found - new start supp"); + + String service1 = "reserve" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupService(service1, "Pending", 2, 200000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Pending", 2, 200000)); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "New"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "2000"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.reserve("NetworkCapacity", null, null, null, ctx); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.NOT_FOUND); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Pending", 2, 200000)); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, 3)); + } + + @Test + public void test008() throws Exception { + String t = "008"; + log.info("============== reserve " + t + " ================================"); + log.info("=== Test capacity not found - change"); + + String service1 = "reserve" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupService(service1, "Active", 2, 200000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Active", 2, 200000)); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Change"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "2000"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.reserve("NetworkCapacity", null, null, null, ctx); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.NOT_FOUND); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Active", 2, 200000)); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, 3)); + } + + @Test + public void test009() throws Exception { + String t = "009"; + log.info("============== reserve " + t + " ================================"); + log.info("=== Test capacity not found - change supp"); + + String service1 = "reserve" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupService(service1, "Active", 2, 200000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + dataSetup.setupService(service1, "Pending", 3, 400000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Active", 2, 200000)); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Pending", 3, 400000)); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Change"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "2000"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.reserve("NetworkCapacity", null, null, null, ctx); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.NOT_FOUND); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Active", 2, 200000)); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Pending", 3, 400000)); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, 4)); + } + + @Test + public void test010() throws Exception { + String t = "010"; + log.info("============== reserve " + t + " ================================"); + log.info("=== Test border condition - connection limit - new start - adding connection " + + "when we are on the limit should fail"); + + String service1 = "reserve" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + for (int i = 1; i <= 40; i++) + dataSetup.setupService("reserve" + t + "/existing-service" + i, "Active", 2, 1000, "mtanjrsv126", + "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + for (int i = 1; i <= 40; i += 4) + dataSetup.setupService("reserve" + t + "/existing-service" + i, "Pending", 3, 1000, "mtanjrsv126", + "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Change"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "1"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.reserve("NetworkCapacity", null, null, null, ctx); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.NOT_FOUND); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, null)); + } + + @Test + public void test011() throws Exception { + String t = "011"; + log.info("============== reserve " + t + " ================================"); + log.info( + "=== Test border condition - connection limit - new start supp should succeed as no new connection being added"); + + String service1 = "reserve" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + for (int i = 1; i <= 39; i++) + dataSetup.setupService("reserve" + t + "/existing-service" + i, "Active", 2, 1000, "mtanjrsv126", + "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + for (int i = 1; i <= 39; i += 4) + dataSetup.setupService("reserve" + t + "/existing-service" + i, "Pending", 3, 1000, "mtanjrsv126", + "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + dataSetup.setupService(service1, "Pending", 2, 1000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Pending", 2, 1000)); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Change"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "5"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.reserve("NetworkCapacity", null, null, null, ctx); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Pending", 3, 5000)); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, 2)); + } + + @Test + public void test012() throws Exception { + String t = "012"; + log.info("============== reserve " + t + " ================================"); + log.info( + "=== Test border condition - connection limit - change should succeed as no new connection being added"); + + String service1 = "reserve" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + for (int i = 1; i <= 39; i++) + dataSetup.setupService("reserve" + t + "/existing-service" + i, "Active", 2, 1000, "mtanjrsv126", + "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + for (int i = 1; i <= 39; i += 4) + dataSetup.setupService("reserve" + t + "/existing-service" + i, "Pending", 3, 1000, "mtanjrsv126", + "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + dataSetup.setupService(service1, "Active", 2, 1000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Active", 2, 1000)); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Change"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "5"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.reserve("NetworkCapacity", null, null, null, ctx); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Active", 2, 1000)); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Pending", 3, 5000)); + } + + @Test + public void test013() throws Exception { + String t = "013"; + log.info("============== reserve " + t + " ================================"); + log.info( + "=== Test border condition - connection limit - change supp should succeed as no new connection being added"); + + String service1 = "reserve" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + for (int i = 1; i <= 39; i++) + dataSetup.setupService("reserve" + t + "/existing-service" + i, "Active", 2, 1000, "mtanjrsv126", + "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + for (int i = 1; i <= 39; i += 4) + dataSetup.setupService("reserve" + t + "/existing-service" + i, "Pending", 3, 1000, "mtanjrsv126", + "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + dataSetup.setupService(service1, "Active", 2, 1000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + dataSetup.setupService(service1, "Pending", 3, 5000, "mtanjrsv126", "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Active", 2, 1000)); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Pending", 3, 5000)); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "Change"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "10"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.reserve("NetworkCapacity", null, null, null, ctx); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Active", 2, 1000)); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Pending", 4, 10000)); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, 3)); + } + + @Test + public void test014() throws Exception { + String t = "014"; + log.info("============== reserve " + t + " ================================"); + log.info("=== Test input validations - invalid request-type in input"); + + String service1 = "reserve" + t + "/service1"; + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "xxxxx"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "10"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + try { + resourceAllocator.reserve("NetworkCapacity", null, null, null, ctx); + } catch (SvcLogicException e) { + Assert.assertTrue(e.getMessage().equals( + "Invalid tmp.resource-allocator.request-type: xxxxx. Supported values are New, Change.")); + return; + } + Assert.fail("SvcLogicException expected"); + } + + @Test + public void test015() throws Exception { + String t = "015"; + log.info("============== reserve " + t + " ================================"); + log.info("=== Test server bw limit depends on number of servers - limit is 960Mbps for 1 server, 1920 for 2"); + + String service1 = "reserve" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupPserver("server1", "MTSNJA4LCP1"); + dataSetup.setupPserver("server2", "MTSNJA4LCP1"); + dataSetup.setupPserver("server3", "MTSNJA4LCP1"); + dataSetup.setupPserver("server4", "MTSNJA4LCP1"); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "New"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "1200"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.reserve("NetworkCapacity", null, null, null, ctx); + + log.info("Result: " + st); + log.info(" tmp.resource-allocator-output.max-available-speed: " + + ctx.getAttribute("tmp.resource-allocator-output.max-available-speed")); + log.info(" tmp.resource-allocator-output.speed-unit: " + + ctx.getAttribute("tmp.resource-allocator-output.speed-unit")); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Pending", 1, 1200000)); + } + + @Test + public void test016() throws Exception { + String t = "016"; + log.info("============== reserve " + t + " ================================"); + log.info("=== Test resource threshold output"); + + String service1 = "reserve" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupPserver("server1", "MTSNJA4LCP1"); + dataSetup.setupPserver("server2", "MTSNJA4LCP1"); + dataSetup.setupPserver("server3", "MTSNJA4LCP1"); + dataSetup.setupPserver("server4", "MTSNJA4LCP1"); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "New"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "1605"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.reserve("NetworkCapacity", null, null, null, ctx); + + log.info("Result: " + st); + for (String key : ctx.getAttributeKeySet()) + if (key.startsWith("tmp.resource-allocator-output")) + log.info(" " + key + ": " + ctx.getAttribute(key)); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Pending", 1, 1605000)); + } + + @Test + public void test017() throws Exception { + String t = "017"; + log.info("============== reserve " + t + " ================================"); + log.info("=== Test if evc_count lookup in MAX_SERVER_SPEED depends on the number of primary servers."); + log.info("=== For 10 existing EVC, it should take the first row, not the second (see data.sql)."); + log.info("=== Applied limit should be 1920Mbps, not 1680Mbps."); + + String service1 = "reserve" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupPserver("server1", "MTSNJA4LCP1"); + dataSetup.setupPserver("server2", "MTSNJA4LCP1"); + dataSetup.setupPserver("server3", "MTSNJA4LCP1"); + dataSetup.setupPserver("server4", "MTSNJA4LCP1"); + + for (int i = 1; i <= 10; i++) + dataSetup.setupService("reserve" + t + "/existing-service" + i, "Active", 2, 100000, "mtanjrsv126", + "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "New"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "800"); // 10*100Mbps existing + 800 = 1800 + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.reserve("NetworkCapacity", null, null, null, ctx); + + log.info("Result: " + st); + log.info(" tmp.resource-allocator-output.max-available-speed: " + + ctx.getAttribute("tmp.resource-allocator-output.max-available-speed")); + log.info(" tmp.resource-allocator-output.speed-unit: " + + ctx.getAttribute("tmp.resource-allocator-output.speed-unit")); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceCorrectInDb("mtanjrsv126", "MTSNJA4LCP1", service1, "Pending", 1, 800000)); + } + + @Test + public void test018() throws Exception { + String t = "018"; + log.info("============== reserve " + t + " ================================"); + log.info("=== Test if evc_count lookup in MAX_SERVER_SPEED depends on the number of primary servers."); + log.info("=== For 11 existing EVC, it should take the second row (see data.sql)."); + log.info("=== Applied limit should be 1680Mbps. We have 11*100 + 700, so this should fail."); + + String service1 = "reserve" + t + "/service1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + dataSetup.setupVplspePort("MTSNJA4LCP1", "mtsnj303vr1", "xe-0/0/2", "PROV", null); + dataSetup.setupPserver("server1", "MTSNJA4LCP1"); + dataSetup.setupPserver("server2", "MTSNJA4LCP1"); + dataSetup.setupPserver("server3", "MTSNJA4LCP1"); + dataSetup.setupPserver("server4", "MTSNJA4LCP1"); + + for (int i = 1; i <= 11; i++) + dataSetup.setupService("reserve" + t + "/existing-service" + i, "Active", 2, 100000, "mtanjrsv126", + "mtsnj303vr1", "MTSNJA4LCP1/Server1"); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "New"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "700"); // 11*100Mbps existing + 700 = 1800 + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + + QueryStatus st = resourceAllocator.reserve("NetworkCapacity", null, null, null, ctx); + + log.info("Result: " + st); + log.info(" tmp.resource-allocator-output.max-available-speed: " + + ctx.getAttribute("tmp.resource-allocator-output.max-available-speed")); + log.info(" tmp.resource-allocator-output.speed-unit: " + + ctx.getAttribute("tmp.resource-allocator-output.speed-unit")); + + log.info("Result: " + st); + + Assert.assertTrue(st == QueryStatus.NOT_FOUND); + Assert.assertTrue(dataSetup.serviceNotInDb(service1, null, null)); + } +} diff --git a/resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/TestReserve2.java b/resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/TestReserve2.java new file mode 100644 index 00000000..a92cbc5a --- /dev/null +++ b/resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/TestReserve2.java @@ -0,0 +1,77 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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 jtest.org.openecomp.sdnc.ra; + +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.MethodSorters; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource.QueryStatus; +import org.openecomp.sdnc.ra.ResourceAllocator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { "classpath:test-context.xml" }) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class TestReserve2 { + + private static final Logger log = LoggerFactory.getLogger(TestReserve2.class); + + @Autowired(required = true) + private ResourceAllocator resourceAllocator; + + @Autowired(required = true) + private DataSetup dataSetup; + + @Test + public void test001() throws Exception { + String t = "001"; + log.info("============== reserve " + t + " ================================"); + log.info("=== Test successful response - new start - all resources available"); + + String service1 = "ICOREPVC" + t + "-1"; + + dataSetup.cleanup(); + dataSetup.setupVpePort("MTSNJA4LCP1", "mtanjrsv126", "ae0", "PROV", "juniper-vpe-image"); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("tmp.resource-allocator.request-type", "New"); + ctx.setAttribute("tmp.resource-allocator.service-model", "L3AVPN-EVC"); + ctx.setAttribute("tmp.resource-allocator.service-instance-id", service1); + ctx.setAttribute("tmp.resource-allocator.speed", "300"); + ctx.setAttribute("tmp.resource-allocator.speed-unit", "Mbps"); + ctx.setAttribute("tmp.resource-allocator.aic-site-id", "MTSNJA4LCP1"); + ctx.setAttribute("tmp.resource-allocator.vpn-id", "123"); + ctx.setAttribute("tmp.resource-allocator.vrf-required", "false"); + + QueryStatus st = resourceAllocator.reserve("NetworkCapacity", null, null, null, ctx); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + Assert.assertTrue(dataSetup.serviceCorrectInDb(service1, "VPE-Cust", "Pending", 1, 300000)); + } +} diff --git a/resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/rm/DataSetup.java b/resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/rm/DataSetup.java new file mode 100644 index 00000000..55824b00 --- /dev/null +++ b/resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/rm/DataSetup.java @@ -0,0 +1,106 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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 jtest.org.openecomp.sdnc.rm; + +import java.util.Date; + +import jtest.util.org.openecomp.sdnc.ra.TestDb; +import jtest.util.org.openecomp.sdnc.ra.TestTable; + +public class DataSetup { + + private TestDb testDb; + + private TestTable resource = null; + private TestTable allocationItem = null; + + private static final String[] RESOURCE_COLUMNS = + { "asset_id", "resource_name", "resource_type", "lt_used", "ll_label", "ll_reference_count", "rr_used" }; + + private static final String[] ALLOCATION_ITEM_COLUMNS = { + "resource_id", "application_id", "resource_set_id", "resource_union_id", "resource_share_group_list", + "lt_used", "ll_label", "rr_used", "allocation_time" }; + + private void initTables() { + if (resource == null) + resource = testDb.table("RESOURCE", "resource_id", RESOURCE_COLUMNS); + if (allocationItem == null) + allocationItem = testDb.table("ALLOCATION_ITEM", "allocation_item_id", ALLOCATION_ITEM_COLUMNS); + } + + public void cleanup() { + allocationItem.delete("true"); + resource.delete("true"); + } + + public void setupLimitItem( + String resourceName, + String assetId, + String resourceSetId, + String resourceUnionId, + long used) { + initTables(); + + Long rid = resource.getId("asset_id = '" + assetId + "' AND resource_name = '" + resourceName + "'"); + if (rid == null) { + resource.add(assetId, resourceName, "Limit", 1, null, null, null); + rid = resource.getLastId(); + } + allocationItem.add(rid, "SDNC", resourceSetId, resourceUnionId, null, used, null, null, new Date()); + } + + public void setupRangeItem( + String resourceName, + String assetId, + String resourceSetId, + String resourceUnionId, + String used) { + initTables(); + + Long rid = resource.getId("asset_id = '" + assetId + "' AND resource_name = '" + resourceName + "'"); + if (rid == null) { + resource.add(assetId, resourceName, "Range", null, null, null, used); + rid = resource.getLastId(); + } + allocationItem.add(rid, "SDNC", resourceSetId, resourceUnionId, null, null, null, used, new Date()); + } + + public void setupLabelItem( + String resourceName, + String assetId, + String resourceSetId, + String resourceUnionId, + String label) { + initTables(); + + Long rid = resource.getId("asset_id = '" + assetId + "' AND resource_name = '" + resourceName + "'"); + if (rid == null) { + resource.add(assetId, resourceName, "Label", null, label, 1, null); + rid = resource.getLastId(); + } + allocationItem.add(rid, "SDNC", resourceSetId, resourceUnionId, null, null, label, null, new Date()); + } + + public void setTestDb(TestDb testDb) { + this.testDb = testDb; + } +} diff --git a/resource-assignment/provider/src/test/java/jtest/util/org/openecomp/sdnc/ra/TestDb.java b/resource-assignment/provider/src/test/java/jtest/util/org/openecomp/sdnc/ra/TestDb.java new file mode 100644 index 00000000..ec7c2abf --- /dev/null +++ b/resource-assignment/provider/src/test/java/jtest/util/org/openecomp/sdnc/ra/TestDb.java @@ -0,0 +1,37 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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 jtest.util.org.openecomp.sdnc.ra; + +import org.springframework.jdbc.core.JdbcTemplate; + +public class TestDb { + + private JdbcTemplate jdbcTemplate; + + public TestTable table(String tableName, String idName, String... columnList) { + return new TestTable(jdbcTemplate, tableName, idName, columnList); + } + + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/resource-assignment/provider/src/test/java/jtest/util/org/openecomp/sdnc/ra/TestTable.java b/resource-assignment/provider/src/test/java/jtest/util/org/openecomp/sdnc/ra/TestTable.java new file mode 100644 index 00000000..64288d96 --- /dev/null +++ b/resource-assignment/provider/src/test/java/jtest/util/org/openecomp/sdnc/ra/TestTable.java @@ -0,0 +1,84 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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 jtest.util.org.openecomp.sdnc.ra; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.support.rowset.SqlRowSet; + +public class TestTable { + + private String tableName; + private String[] columnList; + private String idName; + + private String insertSql; + + private JdbcTemplate jdbcTemplate; + + public TestTable(JdbcTemplate jdbcTemplate, String tableName, String idName, String... columnList) { + this.jdbcTemplate = jdbcTemplate; + this.tableName = tableName; + this.idName = idName; + this.columnList = columnList; + createInsertSql(); + } + + private void createInsertSql() { + StringBuilder ss = new StringBuilder(); + ss.append("INSERT INTO ").append(tableName).append(" ("); + for (String s : columnList) + ss.append(s).append(", "); + ss.setLength(ss.length() - 2); + ss.append(") VALUES ("); + for (int i = 0; i < columnList.length; i++) + ss.append("?, "); + ss.setLength(ss.length() - 2); + ss.append(")"); + insertSql = ss.toString(); + } + + public void add(Object... values) { + jdbcTemplate.update(insertSql, values); + } + + public long getLastId() { + return jdbcTemplate.queryForObject("SELECT max(" + idName + ") FROM " + tableName, Long.class); + } + + public Long getId(String where) { + String selectSql = "SELECT " + idName + " FROM " + tableName + " WHERE " + where; + SqlRowSet rs = jdbcTemplate.queryForRowSet(selectSql); + if (rs.first()) + return rs.getLong(idName); + return null; + } + + public boolean exists(String where) { + String selectSql = "SELECT * FROM " + tableName + " WHERE " + where; + SqlRowSet rs = jdbcTemplate.queryForRowSet(selectSql); + return rs.first(); + } + + public void delete(String where) { + jdbcTemplate.update("DELETE FROM " + tableName + " WHERE " + where); + } +} diff --git a/resource-assignment/provider/src/test/resources/homing-req.json b/resource-assignment/provider/src/test/resources/homing-req.json new file mode 100644 index 00000000..48ec701a --- /dev/null +++ b/resource-assignment/provider/src/test/resources/homing-req.json @@ -0,0 +1,46 @@ +/*- + * ============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========================================================= + */ + +{ + "input":{ + "sdnc-homing-header":{ + "svc-request-id":"omx-123", + "svc-action":"homing" + }, + "request-information":{ + "request-id":"mso-1234", + "request-action":"GetAicNodesRequest", + "source":"OMX", + "list-length":1 + }, + "homing-request-information":{ + "service-type":"SDN-ETHERNET-INTERNET", + "global-customer-id":"custid-123", + "customer-location":{ + "lata":332 + } + }, + "homing-other-information":{ + "bandwidth-value":150, + "bandwidth-units":"Mbps" + } + } +} diff --git a/resource-assignment/provider/src/test/resources/log4j.properties b/resource-assignment/provider/src/test/resources/log4j.properties new file mode 100644 index 00000000..6d6e30ff --- /dev/null +++ b/resource-assignment/provider/src/test/resources/log4j.properties @@ -0,0 +1,26 @@ +### +# ============LICENSE_START======================================================= +# openECOMP : SDN-C +# ================================================================================ +# Copyright (C) 2017 ONAP 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========================================================= +### + +log4j.rootLogger=INFO, A1 +log4j.appender.A1=org.apache.log4j.ConsoleAppender +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=%d{ISO8601} %5p %t %X{UUID} %c{3}:%L - %m%n +log4j.logger.org.hibernate=INFO diff --git a/resource-assignment/provider/src/test/resources/param.txt b/resource-assignment/provider/src/test/resources/param.txt new file mode 100755 index 00000000..d1aac477 --- /dev/null +++ b/resource-assignment/provider/src/test/resources/param.txt @@ -0,0 +1,44 @@ +isAvailable: + Input in ctx: + tmp.resource-allocator.aic-site-id + tmp.resource-allocator.speed + tmp.resource-allocator.speed-unit + Output in ctx: + tmp.resource-allocator.max-available-speed + tmp.resource-allocator.speed-unit + Return: + SUCCESS – capacity available + NOT_FOUND – capacity not available + Error message in: error-message, error-code + FAILURE – the check has failed (data error, code defect, etc) + Error message in: error-message, error-code + +Reserve: + Input in ctx: + tmp.resource-allocator.aic-site-id + tmp.resource-allocator.speed + tmp.resource-allocator.speed-unit + tmp.resource-allocator.service-instance-id + tmp.resource-allocator.request-type { New, Change } + Output in ctx: + tmp.resource-allocator-output.max-available-speed + tmp.resource-allocator-output.speed-unit + Return: + SUCCESS – capacity available + NOT_FOUND – capacity not available + Error message in: error-message, error-code + FAILURE – the check has failed (data error, code defect, etc) + Error message in: error-message, error-code + +Release: + Input in ctx: + tmp.resource-allocator.service-instance-id + tmp.resource-allocator.request-type { Activate, Cancel, Disconnect } + Return: + SUCCESS – capacity available + FAILURE – the check has failed (data error, code defect, etc) + Error message in: error-message, error-code + + +Plugin name: org.openecomp.sdnc.ra.ResourceAllocator +Resource: NetworkCapacity diff --git a/resource-assignment/provider/src/test/resources/sql/data.sql b/resource-assignment/provider/src/test/resources/sql/data.sql new file mode 100644 index 00000000..2214bce7 --- /dev/null +++ b/resource-assignment/provider/src/test/resources/sql/data.sql @@ -0,0 +1,120 @@ +--- +-- ============LICENSE_START======================================================= +-- openECOMP : SDN-C +-- ================================================================================ +-- Copyright (C) 2017 ONAP 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========================================================= +--- + +INSERT INTO RESOURCE_RULE ( + resource_name, service_model, end_point_position, service_expression, equipment_level, equipment_expression, + allocation_expression, soft_limit_expression, hard_limit_expression) +VALUES ( + 'Bandwidth', 'L3SDN', 'IPAG-TOA', 'true', 'Port', 'true', + 'service-speed-kbps', '0.5 * max-port-speed', '0.9 * max-port-speed'); + +INSERT INTO RESOURCE_RULE ( + resource_name, service_model, end_point_position, service_expression, equipment_level, equipment_expression, + allocation_expression, soft_limit_expression, hard_limit_expression) +VALUES ( + 'Bandwidth', 'L3SDN', 'VCE-Cust', 'true', 'Server', 'true', + 'service-speed-kbps', '0.6 * max-server-speed * number-primary-servers', 'max-server-speed * number-primary-servers'); + +INSERT INTO RESOURCE_RULE ( + resource_name, service_model, end_point_position, service_expression, equipment_level, + equipment_expression, allocation_expression, soft_limit_expression, hard_limit_expression) +VALUES ( + 'Connection', 'L3SDN', 'VCE-Cust', 'true', 'Server', + 'true', '1', '40', '40'); + +INSERT INTO RESOURCE_RULE ( + resource_name, service_model, end_point_position, service_expression, equipment_level, equipment_expression, + allocation_expression, soft_limit_expression, hard_limit_expression) +VALUES ( + 'Bandwidth', 'L3SDN', 'VPE-Cust', 'true', 'Port', 'true', + 'service-speed-kbps', '0.5 * max-port-speed', '0.9 * max-port-speed'); + +INSERT INTO RESOURCE_RULE ( + resource_name, service_model, end_point_position, service_expression, + equipment_level, equipment_expression, allocation_expression, soft_limit_expression, hard_limit_expression) +VALUES ( + 'Bandwidth', 'L3AVPN-EVC', 'VPE-Cust', 'true', 'Port', 'true', 'service-speed-kbps', '8000000', '8000000'); + +INSERT INTO RESOURCE_RULE ( + resource_name, service_model, end_point_position, service_expression, + equipment_level, equipment_expression, allocation_expression, soft_limit_expression, hard_limit_expression) +VALUES ( + 'Connection', 'L3AVPN-EVC', 'VPE-Cust', 'true', 'Port', 'true', '1', '200', '200'); + +INSERT INTO RESOURCE_RULE ( + resource_name, service_model, end_point_position, service_expression, + equipment_level, equipment_expression, allocation_expression, soft_limit_expression, hard_limit_expression) +VALUES ( + 'Bandwidth', 'L3AVPN-PORT', 'VPE-Cust', 'true', 'Port', 'true', 'service-speed-kbps', '8000000', '8000000'); + +insert into RESOURCE_THRESHOLD ( + resource_rule_id, threshold_expression, threshold_message) +values ( + (select resource_rule_id from RESOURCE_RULE where resource_name = 'Bandwidth' and equipment_level = 'Server'), + '0.5 * max-server-speed * number-primary-servers', + 'The provisioned access bandwidth is at or exceeds 50% of the total server capacity.'); + +insert into RESOURCE_THRESHOLD ( + resource_rule_id, threshold_expression, threshold_message) +values ( + (select resource_rule_id from RESOURCE_RULE where resource_name = 'Bandwidth' and equipment_level = 'Server'), + '0.7 * max-server-speed * number-primary-servers', + 'The provisioned access bandwidth is at or exceeds 70% of the total server capacity.'); + +INSERT INTO RANGE_RULE ( + range_name, service_model, end_point_position, equipment_level, min_value, max_value) +VALUES ( + 'subinterface-id', 'L3AVPN-EVC', 'VPE-Cust', 'Port', 100, 3999); + +INSERT INTO RANGE_RULE ( + range_name, service_model, end_point_position, equipment_level, min_value, max_value) +VALUES ( + 'vlan-id-inner', 'L3AVPN-EVC', 'VPE-Cust', 'Port', 2, 4091); + +INSERT INTO RANGE_RULE ( + range_name, service_model, end_point_position, equipment_level, min_value, max_value) +VALUES ( + 'bundle-id', 'L3AVPN-PORT', 'VPE-Cust', 'Port', 1, 99999); + +INSERT INTO MAX_PORT_SPEED ( + image_file_name, end_point_position, interface_name, max_speed, unit) +VALUES ( + 'JUNIPER_VPE_IMAGE_FILENAME', 'VPE-Cust', 'ae0', 5000, 'Mpbs'); + +INSERT INTO MAX_SERVER_SPEED (server_model, evc_count, max_speed, unit, description) +VALUES ('ALL', 5, 1600, 'Mbps', 'Max speed, when there are <=5 EVC on server'); + +INSERT INTO MAX_SERVER_SPEED (server_model, evc_count, max_speed, unit, description) +VALUES ('ALL', 10, 1400, 'Mbps', 'Max speed, when there are 6 to 10 (including 10) EVC on server'); + +INSERT INTO MAX_SERVER_SPEED (server_model, evc_count, max_speed, unit, description) +VALUES ('ALL', 15, 1000, 'Mbps', 'Max speed, when there are 11 to 15 (including 15) EVC on server'); + +INSERT INTO MAX_SERVER_SPEED (server_model, evc_count, max_speed, unit, description) +VALUES ('ALL', 20, 700, 'Mbps', 'Max speed, when there are 16 to 20 (including 20) EVC on server'); + +INSERT INTO MAX_SERVER_SPEED (server_model, evc_count, max_speed, unit, description) +VALUES ('ALL', 10000, 500, 'Mbps', 'Max speed, when there are 21 or more EVC on server'); + +INSERT INTO PARAMETERS (name, value, category, memo) +VALUES ('homing.pserver.sparing.ratio', '1:1', 'homing', + 'Ratio of primary to backup servers within any of the AIC sites. Used in RA to calculate the max allowed bw in an AIC site.'); + diff --git a/resource-assignment/provider/src/test/resources/sql/schema.sql b/resource-assignment/provider/src/test/resources/sql/schema.sql new file mode 100644 index 00000000..e650337e --- /dev/null +++ b/resource-assignment/provider/src/test/resources/sql/schema.sql @@ -0,0 +1,201 @@ +--- +-- ============LICENSE_START======================================================= +-- openECOMP : SDN-C +-- ================================================================================ +-- Copyright (C) 2017 ONAP 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========================================================= +--- + +CREATE TABLE RESOURCE_LOCK ( + resource_lock_id SERIAL PRIMARY KEY, + resource_name VARCHAR(50) NOT NULL UNIQUE, + lock_holder VARCHAR(100) NOT NULL, + lock_count SMALLINT NOT NULL, + lock_time DATETIME NOT NULL, + expiration_time DATETIME NOT NULL +); + +CREATE TABLE RESOURCE ( + resource_id SERIAL PRIMARY KEY, + asset_id VARCHAR(50) NOT NULL, + resource_name VARCHAR(50) NOT NULL, + resource_type VARCHAR(10) NOT NULL, + lt_used BIGINT, + ll_label VARCHAR(50), + ll_reference_count SMALLINT, + rr_used VARCHAR(4000) +); + +ALTER TABLE RESOURCE ADD CONSTRAINT c1_resource CHECK (resource_type IN ('Limit', 'Label', 'Range')); +CREATE UNIQUE INDEX ak1_resource ON RESOURCE (asset_id, resource_name); + +CREATE TABLE RESOURCE_LOAD ( + resource_load_id SERIAL PRIMARY KEY, + resource_id BIGINT NOT NULL REFERENCES resource (resource_id), + application_id VARCHAR(20) NOT NULL, + resource_load_time DATETIME NOT NULL, + resource_expiration_time DATETIME +); + +CREATE INDEX i1_resource_load ON RESOURCE_LOAD (resource_id); +CREATE UNIQUE INDEX ak1_resource_load ON RESOURCE_LOAD (resource_id, application_id); + +CREATE TABLE ALLOCATION_ITEM ( + allocation_item_id SERIAL PRIMARY KEY, + resource_id BIGINT NOT NULL REFERENCES resource (resource_id), + application_id VARCHAR(50) NOT NULL, + resource_set_id VARCHAR(50) NOT NULL, + resource_union_id VARCHAR(50) NOT NULL, + resource_share_group_list VARCHAR(200), + lt_used BIGINT, + ll_label VARCHAR(50), + rr_used VARCHAR(200), + allocation_time DATETIME NOT NULL +); + +CREATE INDEX i1_allocation_item ON allocation_item (resource_id); +CREATE UNIQUE INDEX ak1_allocation_item ON allocation_item (resource_id, resource_set_id); + +CREATE TABLE RESOURCE_RULE ( + resource_rule_id SERIAL PRIMARY KEY, + resource_name VARCHAR(50) NOT NULL, + service_model VARCHAR(50) NOT NULL, + end_point_position VARCHAR(50) NOT NULL, + service_expression VARCHAR(2000) NOT NULL, + equipment_level VARCHAR(50) NOT NULL, + equipment_expression VARCHAR(2000) NOT NULL, + allocation_expression VARCHAR(2000) NOT NULL, + soft_limit_expression VARCHAR(2000) NOT NULL, + hard_limit_expression VARCHAR(2000) NOT NULL +); + +CREATE TABLE RESOURCE_THRESHOLD ( + resource_threshold_id bigint(20) unsigned NOT NULL AUTO_INCREMENT, + resource_rule_id bigint(20) NOT NULL, + threshold_expression varchar(2000) NOT NULL, + threshold_message varchar(2000) NOT NULL, + PRIMARY KEY (resource_threshold_id) +); + +CREATE TABLE RANGE_RULE ( + range_rule_id SERIAL PRIMARY KEY, + range_name VARCHAR(50) NOT NULL, + service_model VARCHAR(50) NOT NULL, + end_point_position VARCHAR(50) NOT NULL, + equipment_level VARCHAR(50) NOT NULL, + min_value INT NOT NULL, + max_value INT NOT NULL +); + +CREATE TABLE MAX_PORT_SPEED ( + max_port_speed_id SERIAL PRIMARY KEY, + image_file_name VARCHAR(50) NOT NULL, + end_point_position VARCHAR(50) NOT NULL, + interface_name VARCHAR(100) NOT NULL, + max_speed BIGINT NOT NULL, + unit VARCHAR(10) NOT NULL +); + +CREATE TABLE MAX_SERVER_SPEED ( + max_server_speed_id SERIAL PRIMARY KEY, + server_model VARCHAR(50) NOT NULL, + evc_count SMALLINT NOT NULL, + max_speed BIGINT NOT NULL, + unit VARCHAR(10) NOT NULL, + description VARCHAR(500) +); + +CREATE TABLE SERVICE_RESOURCE ( + service_resource_id SERIAL PRIMARY KEY, + service_instance_id VARCHAR(80) NOT NULL, + service_status VARCHAR(10) NOT NULL, + service_change_number SMALLINT NOT NULL, + resource_set_id VARCHAR(100) NOT NULL, + resource_union_id VARCHAR(100) NOT NULL, +); + +ALTER TABLE SERVICE_RESOURCE ADD CONSTRAINT C1_SERVICE_RESOURCE CHECK (service_status IN ('Active', 'Pending')); +CREATE INDEX i1_service_resource ON SERVICE_RESOURCE (service_instance_id); +CREATE UNIQUE INDEX ak1_service_resource ON SERVICE_RESOURCE (service_instance_id, service_change_number); + +CREATE TABLE VPE_POOL ( + vpe_name VARCHAR(20) NOT NULL, + ipv4_oam_address VARCHAR(20) NOT NULL, + loopback0_ipv4_address VARCHAR(20) NOT NULL, + provisioning_status VARCHAR(10) NOT NULL, + aic_site_id VARCHAR(100) NOT NULL, + availability_zone VARCHAR(100) NOT NULL, + vlan_id_outer VARCHAR(20) NOT NULL, + vendor VARCHAR(20) NOT NULL, + physical_intf_name VARCHAR(40) NOT NULL, + physical_intf_speed VARCHAR(20) NOT NULL, + physical_intf_units VARCHAR(20) NOT NULL, + vpe_uuid VARCHAR(80) DEFAULT NULL, + vpe_id VARCHAR(80) DEFAULT NULL, + image_filename VARCHAR(100) DEFAULT NULL, + PRIMARY KEY (aic_site_id, vpe_name, availability_zone) +); + +CREATE TABLE VPLSPE_POOL ( + vplspe_name varchar(20) NOT NULL, + aic_site_id varchar(100) NOT NULL, + availability_zone varchar(100) NOT NULL, + physical_intf_name varchar(40) NOT NULL, + physical_intf_speed varchar(20) NOT NULL, + physical_intf_units varchar(20) NOT NULL, + loopback0_ipv4_address varchar(20) NOT NULL, + vlan_id_outer varchar(20) NOT NULL, + vplspe_uuid varchar(80) DEFAULT NULL, + image_filename varchar(100) DEFAULT NULL, + provisioning_status varchar(10) DEFAULT NULL, + vendor varchar(20) DEFAULT NULL, + PRIMARY KEY (vplspe_name, aic_site_id, availability_zone, physical_intf_name) +); + +CREATE TABLE VPE_LOCK ( + vpe_name varchar(20) NOT NULL, + vpn_lock varchar(20) NOT NULL, + PRIMARY KEY (vpe_name) +); + +CREATE TABLE PARAMETERS ( + name varchar(100) PRIMARY KEY, + value varchar(24) NOT NULL, + category varchar(24) NOT NULL, + memo varchar(128) +); + +CREATE TABLE PSERVER ( + hostname varchar(255) NOT NULL, + ptnii_equip_name varchar(255), + number_of_cpus varchar(255), + disk_in_gigabytes varchar(255), + ram_in_megabytes varchar(255), + equip_type varchar(255), + equip_vendor varchar(255), + equip_model varchar(255), + fqdn varchar(255), + pserver_selflink varchar(255), + ipv4_oam_address varchar(15), + serial_number varchar(255), + pserver_id varchar(255), + internet_topology varchar(40), + aic_site_id varchar(100), + in_maint varchar(5), + pserver_name2 varchar(255), + purpose varchar(255), + PRIMARY KEY (hostname) +); diff --git a/resource-assignment/provider/src/test/resources/svc-topology-req.json b/resource-assignment/provider/src/test/resources/svc-topology-req.json new file mode 100644 index 00000000..ab8afb66 --- /dev/null +++ b/resource-assignment/provider/src/test/resources/svc-topology-req.json @@ -0,0 +1,195 @@ +/*- + * ============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========================================================= + */ + +{ + "input":{ + "sdnc-request-header":{ + "svc-request-id":"omx-123", + "svc-action":"assign" + }, + "sdnc-topology-additional-data":{ + "svc-vnf-type":"vce" + }, + "request-information":{ + "request-id":"mso-1234", + "request-action":"Layer3ServiceActivateRequest", + "source":"OMX" + }, + "service-information":{ + "service-type":"SDN-ETHERNET-INTERNET", + "service-instance-id":"service-instance-123", + "subscriber-name":"ssb-subscriber" + }, + "l2-homing-information":{ + "evc-name":"EVC-123", + "topology":"PointToPoint", + "preferred-aic-clli":"ATLNGATL001" + } + "internet-evc-access-information":{ + "internet-evc-speed-value":"150", + "internet-evc-speed-units":"Mbps", + "ip-version":"v6" + } + "vr-lan":{ + "routing-protocol":"none", + { + "v6-vr-lan-prefix":"string", + "v6-public-lan-prefixes":{ + "t-provided-v6-lan-public-prefixes":[ + { + "v6-lan-public-prefix-length":"integer", + "v6-lan-public-prefix":"string", + "request-index":"integer" + } + ] + }, + "v6-vr-lan-prefix-length":"integer", + "v4-vr-lan-prefix-length":"integer", + "firewall-lite":{ + "v6-firewall-packet-filters":[ + { + "v6-firewall-prefix-length":"integer", + "udp-port-list":[ + { + "port-number":"integer" + } + ], + "tcp-port-list":[ + { + "port-number":"integer" + } + ], + "v6-firewall-prefix":"string" + } + ], + "v4-firewall-packet-filters":[ + { + "v4-firewall-prefix-length":"integer", + "udp-port-list":[ + { + "port-number":"integer" + } + ], + "tcp-port-list":[ + { + "port-number":"integer" + } + ], + "v4-firewall-prefix":"string" + } + ] + }, + "v6-vce-wan-address":"string", + "v4-public-lan-prefixes":{ + "t-provided-v4-lan-public-prefixes":[ + { + "v4-lan-public-prefix":"string", + "v4-lan-public-prefix-length":"integer", + "request-index":"integer" + } + ] + }, + "pat":{ + "v4-pat-default-pool-prefix-length":"integer", + "v4-pat-pools":[ + { + "v4-pat-pool-next-hop-address":"string", + "v4-pat-pool-prefix-length":"integer", + "v4-pat-pool-prefix":"string" + } + ], + "v4-pat-default-pool-prefix":"string" + }, + "v4-vce-loopback-address":"string", + "v4-vr-lan-prefix":"string", + "dhcp":{ + "v4-dhcp-pools":[ + { + "v4-dhcp-relay-next-hop-address":"string", + "excluded-v4-addresses":[ + { + "excluded-v4-address":"string" + } + ], + "v4-dhcp-pool-prefix":"string", + "v4-dhcp-relay-gateway-address":"string", + "v4-dhcp-pool-prefix-length":"integer" + } + ], + "excluded-v4-dhcp-addresses-from-default-pool":[ + { + "excluded-v4-address":"string" + } + ], + "v6-dhcp-pools":[ + { + "v6-dhcp-relay-gateway-address":"string", + "excluded-v6-addresses":[ + { + "excluded-v6-address":"string" + } + ], + "v6-dhcp-pool-prefix-length":"integer", + "v6-dhcp-relay-next-hop-address":"string", + "v6-dhcp-pool-prefix":"string" + } + ], + "v6-dhcp-default-pool-prefix":"string", + "v6-dhcp-default-pool-prefix-length":"integer", + "v4-dhcp-default-pool-prefix":"string", + "excluded-v6-dhcp-addresses-from-default-pool":[ + { + "excluded-v6-address":"string" + } + ], + "v4-dhcp-default-pool-prefix-length":"integer" + }, + "nat":{ + "v4-nat-mapping-entries":[ + { + "v4-nat-external":"string", + "v4-nat-next-hop-address":"string", + "v4-nat-internal":"string" + } + ] + }, + "static-routes":{ + "v6-static-routes":[ + { + "v6-static-route-prefix-length":"integer", + "v6-next-hop-address":"string", + "v6-static-route-prefix":"string" + } + ], + "v4-static-routes":[ + { + "v4-static-route-prefix-length":"integer", + "v4-static-route-prefix":"string", + "v4-next-hop-address":"string" + } + ] + } + } + + } + + } +} diff --git a/resource-assignment/provider/src/test/resources/test-context.xml b/resource-assignment/provider/src/test/resources/test-context.xml new file mode 100644 index 00000000..89aea439 --- /dev/null +++ b/resource-assignment/provider/src/test/resources/test-context.xml @@ -0,0 +1,297 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sql-resource/.gitignore b/sql-resource/.gitignore new file mode 100755 index 00000000..b73caf31 --- /dev/null +++ b/sql-resource/.gitignore @@ -0,0 +1,34 @@ +#####standard .git ignore entries##### + +## IDE Specific Files ## +org.eclipse.core.resources.prefs +.classpath +.project +.settings +.idea +.externalToolBuilders +maven-eclipse.xml +workspace + +## Compilation Files ## +*.class +**/target +target +target-ide +MANIFEST.MF + +## Misc Ignores (OS specific etc) ## +bin/ +dist +*~ +*.ipr +*.iml +*.iws +classes +out/ +.DS_STORE +.metadata + +## Folders which contain auto generated source code ## +yang-gen-config +yang-gen-sal diff --git a/sql-resource/features/pom.xml b/sql-resource/features/pom.xml new file mode 100755 index 00000000..1f75be2f --- /dev/null +++ b/sql-resource/features/pom.xml @@ -0,0 +1,134 @@ + + + 4.0.0 + + sql-resource + org.openecomp.sdnc.adaptors + 0.0.1-SNAPSHOT + + sql-resource-features + Sql Resource Adaptor - Features + + jar + + + + + + org.openecomp.sdnc.adaptors + sql-resource-provider + ${project.version} + + + + commons-lang + commons-lang + 2.6 + compile + + + + org.opendaylight.mdsal + features-mdsal + ${odl.mdsal.features.version} + features + xml + + runtime + + + + + + org.opendaylight.odlparent + opendaylight-karaf-empty + ${odl.karaf.empty.distro.version} + zip + + + + + + org.opendaylight.odlparent + features-test + ${odl.commons.opendaylight.version} + test + + + + org.opendaylight.yangtools + features-yangtools + ${odl.yangtools.version} + features + xml + runtime + + + + + + + true + src/main/resources + + + + + org.apache.maven.plugins + maven-resources-plugin + + + filter + + resources + + generate-resources + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + attach-artifacts + + attach-artifact + + package + + + + ${project.build.directory}/classes/${features.file} + xml + features + + + + + + + + + diff --git a/sql-resource/features/src/main/resources/features.xml b/sql-resource/features/src/main/resources/features.xml new file mode 100644 index 00000000..adf51f4a --- /dev/null +++ b/sql-resource/features/src/main/resources/features.xml @@ -0,0 +1,39 @@ + + + + + + + mvn:org.opendaylight.mdsal/features-mdsal/${odl.mdsal.features.version}/xml/features + + + + + odl-mdsal-broker + sdnc-sli + sdnc-dblib + mvn:org.openecomp.sdnc.adaptors/sql-resource-provider/${project.version} + + + diff --git a/sql-resource/installer/pom.xml b/sql-resource/installer/pom.xml new file mode 100755 index 00000000..93204777 --- /dev/null +++ b/sql-resource/installer/pom.xml @@ -0,0 +1,138 @@ + + + 4.0.0 + + sql-resource + org.openecomp.sdnc.adaptors + 0.0.1-SNAPSHOT + + sql-resource-installer + SQL Resource - Karaf Installer + pom + + + sdnc-sql-resource + sdnc-sql-resource + mvn:org.openecomp.sdnc.adaptors/sql-resource-features/${project.version}/xml/features + false + + + + + + org.openecomp.sdnc.adaptors + sql-resource-features + ${project.version} + features + xml + + + * + * + + + + + + org.openecomp.sdnc.adaptors + sql-resource-provider + ${project.version} + + + + + + + + maven-assembly-plugin + 2.6 + + + maven-repo-zip + + single + + package + + false + stage/${application.name}-${project.version} + + src/assembly/assemble_mvnrepo_zip.xml + + false + + + + installer-zip + + single + + package + + true + ${application.name}-${project.version}-installer + + src/assembly/assemble_installer_zip.xml + + false + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + + copy-dependencies + + prepare-package + + false + ${project.build.directory}/assembly/system + false + true + true + true + false + false + org.openecomp.sdnc + sli-common,sli-provider,dblib-provider + provided + + + + + + maven-resources-plugin + 2.6 + + + copy-version + + copy-resources + + validate + + ${basedir}/target/stage + + + src/main/resources/scripts + + install-feature.sh + + true + + + + + + + + + + + + diff --git a/sql-resource/installer/src/assembly/assemble_installer_zip.xml b/sql-resource/installer/src/assembly/assemble_installer_zip.xml new file mode 100644 index 00000000..e278872a --- /dev/null +++ b/sql-resource/installer/src/assembly/assemble_installer_zip.xml @@ -0,0 +1,59 @@ + + + + + + installer_zip + + zip + + + + false + + + + target/stage/ + ${application.name} + 755 + + *.sh + + + + target/stage/ + ${application.name} + 644 + + *.sh + + + + + + + diff --git a/sql-resource/installer/src/assembly/assemble_mvnrepo_zip.xml b/sql-resource/installer/src/assembly/assemble_mvnrepo_zip.xml new file mode 100644 index 00000000..1edacdb6 --- /dev/null +++ b/sql-resource/installer/src/assembly/assemble_mvnrepo_zip.xml @@ -0,0 +1,49 @@ + + + + + + mvnrepo_zip + + zip + + + + false + + + + target/assembly/ + . + + + + + + + + diff --git a/sql-resource/installer/src/main/resources/scripts/install-feature.sh b/sql-resource/installer/src/main/resources/scripts/install-feature.sh new file mode 100644 index 00000000..9a47d222 --- /dev/null +++ b/sql-resource/installer/src/main/resources/scripts/install-feature.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +### +# ============LICENSE_START======================================================= +# openECOMP : SDN-C +# ================================================================================ +# Copyright (C) 2017 ONAP 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========================================================= +### + +ODL_HOME=${ODL_HOME:-/opt/opendaylight/current} +ODL_KARAF_CLIENT=${ODL_KARAF_CLIENT:-${ODL_HOME}/bin/client} +ODL_KARAF_CLIENT_OPTS=${ODL_KARAF_CLIENT_OPTS:-"-u karaf"} +INSTALLERDIR=$(dirname $0) + +REPOZIP=${INSTALLERDIR}/${features.boot}-${project.version}.zip + +if [ -f ${REPOZIP} ] +then + unzip -d ${ODL_HOME} ${REPOZIP} +else + echo "ERROR : repo zip ($REPOZIP) not found" + exit 1 +fi + +${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:repo-add ${features.repositories} +${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:install ${features.boot} diff --git a/sql-resource/pom.xml b/sql-resource/pom.xml new file mode 100755 index 00000000..a8d8ae69 --- /dev/null +++ b/sql-resource/pom.xml @@ -0,0 +1,43 @@ + + + + org.openecomp.sdnc.adaptors + sdnc-adaptors + 0.0.1-SNAPSHOT + + + 4.0.0 + pom + org.openecomp.sdnc.adaptors + sql-resource + + + Sql Resource Adaptor + The Sql resource adaptor allows service logic to read/write data from a local database using direct SQL statements + + 0.0.1-SNAPSHOT + + + + + org.openecomp.sdnc.adaptors + sql-resource-features + features + xml + ${project.version} + + + + org.openecomp.sdnc.adaptors + sql-resource-provider + ${project.version} + + + + + + provider + features + installer + + diff --git a/sql-resource/provider/pom.xml b/sql-resource/provider/pom.xml new file mode 100755 index 00000000..fd773af2 --- /dev/null +++ b/sql-resource/provider/pom.xml @@ -0,0 +1,105 @@ + + + 4.0.0 + + org.openecomp.sdnc.adaptors + sql-resource + 0.0.1-SNAPSHOT + + sql-resource-provider + bundle + Sql Resource Adaptor - Provider + http://maven.apache.org + + UTF-8 + + + + junit + junit + ${junit.version} + test + + + org.onap.ccsdk.sli.core + sli-common + ${sdnctl.sli.version} + compile + + + org.onap.ccsdk.sli.core + sli-provider + ${sdnctl.sli.version} + compile + + + equinoxSDK381 + org.eclipse.osgi + ${equinox.osgi.version} + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + jcl-over-slf4j + ${slf4j.version} + + + org.slf4j + slf4j-simple + ${slf4j.version} + compile + + + org.onap.ccsdk.sli.core + dblib-provider + ${sdnctl.dblib.version} + + + + + + + + + + org.apache.felix + maven-bundle-plugin + ${bundle.plugin.version} + true + + + org.openecomp.sdnc.sli.resource.sql + org.openecomp.sdnc.sli.resource.sql.SqlResourceActivator + org.openecomp.sdnc.sli.resource.sql + * + * + + + + + + + + + + + diff --git a/sql-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/sql/SqlResource.java b/sql-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/sql/SqlResource.java new file mode 100644 index 00000000..9c0007eb --- /dev/null +++ b/sql-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/sql/SqlResource.java @@ -0,0 +1,516 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.resource.sql; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Map; +import java.util.Map.Entry; + +import javax.sql.rowset.CachedRowSet; + +import org.apache.commons.lang3.StringUtils; +import org.onap.ccsdk.sli.core.dblib.DBResourceManager; +import org.onap.ccsdk.sli.core.dblib.DbLibService; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource.QueryStatus; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.ServiceReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SqlResource implements SvcLogicResource, SvcLogicJavaPlugin { + + private static final Logger LOG = LoggerFactory.getLogger(SqlResource.class); + + private static final String DBLIB_SERVICE = "org.openecomp.sdnc.sli.resource.dblib.DBResourceManager"; + + private static String CRYPT_KEY = ""; + + public SqlResource() { + } + + // For sql-resource, is-available is the same as exists + @Override + public QueryStatus isAvailable(String resource, String key, String prefix, SvcLogicContext ctx) + throws SvcLogicException { + + return (exists(resource, key, prefix, ctx)); + + } + + @Override + public QueryStatus exists(String resource, String key, String prefix, SvcLogicContext ctx) + throws SvcLogicException { + + DbLibService dblibSvc = getDbLibService(); + if (dblibSvc == null) { + return (QueryStatus.FAILURE); + } + + String theStmt = resolveCtxVars(key, ctx); + + try { + CachedRowSet results = dblibSvc.getData(theStmt, null, null); + + if (!results.next()) { + return (QueryStatus.NOT_FOUND); + } + + int numRows = results.getInt(1); + + if (numRows > 0) { + return (QueryStatus.SUCCESS); + } else { + return (QueryStatus.NOT_FOUND); + } + } catch (Exception e) { + LOG.error("Caught SQL exception", e); + return (QueryStatus.FAILURE); + } + } + + // @Override + public QueryStatus query(String resource, boolean localOnly, String select, String key, String prefix, + String orderBy, SvcLogicContext ctx) throws SvcLogicException { + + DbLibService dblibSvc = getDbLibService(); + + if (dblibSvc == null) { + return (QueryStatus.FAILURE); + } + + String sqlQuery = resolveCtxVars(key, ctx); + + try { + + CachedRowSet results = dblibSvc.getData(sqlQuery, null, null); + + QueryStatus retval = QueryStatus.SUCCESS; + + if (!results.next()) { + retval = QueryStatus.NOT_FOUND; + LOG.debug("No data found"); + } else { + saveCachedRowSetToCtx(results, ctx, prefix, dblibSvc); + } + return (retval); + } catch (Exception e) { + LOG.error("Caught SQL exception", e); + return (QueryStatus.FAILURE); + } + } + + public void saveCachedRowSetToCtx(CachedRowSet results, SvcLogicContext ctx, String prefix, DbLibService dblibSvc) + throws SQLException { + if (ctx != null) { + if ((prefix != null) && prefix.endsWith("[]")) { + // Return an array. + String pfx = prefix.substring(0, prefix.length() - 2); + int idx = 0; + do { + ResultSetMetaData rsMeta = results.getMetaData(); + int numCols = rsMeta.getColumnCount(); + + for (int i = 0; i < numCols; i++) { + String colValue = null; + String tableName = rsMeta.getTableName(i + 1); + if (rsMeta.getColumnType(i + 1) == java.sql.Types.VARBINARY) { + colValue = decryptColumn(tableName, rsMeta.getColumnName(i + 1), results.getBytes(i + 1), + dblibSvc); + } else { + colValue = results.getString(i + 1); + } + LOG.debug("Setting " + pfx + "[" + idx + "]." + + rsMeta.getColumnLabel(i + 1).replaceAll("_", "-") + " = " + colValue); + ctx.setAttribute(pfx + "[" + idx + "]." + rsMeta.getColumnLabel(i + 1).replaceAll("_", "-"), + colValue); + } + idx++; + } while (results.next()); + LOG.debug("Setting " + pfx + "_length = " + idx); + ctx.setAttribute(pfx + "_length", "" + idx); + } else { + ResultSetMetaData rsMeta = results.getMetaData(); + int numCols = rsMeta.getColumnCount(); + + for (int i = 0; i < numCols; i++) { + String colValue = null; + String tableName = rsMeta.getTableName(i + 1); + if ("VARBINARY".equalsIgnoreCase(rsMeta.getColumnTypeName(i + 1))) { + colValue = decryptColumn(tableName, rsMeta.getColumnName(i + 1), results.getBytes(i + 1), + dblibSvc); + } else { + colValue = results.getString(i + 1); + } + if (prefix != null) { + LOG.debug("Setting " + prefix + "." + rsMeta.getColumnLabel(i + 1).replaceAll("_", "-") + " = " + + colValue); + ctx.setAttribute(prefix + "." + rsMeta.getColumnLabel(i + 1).replaceAll("_", "-"), colValue); + } else { + LOG.debug("Setting " + rsMeta.getColumnLabel(i + 1).replaceAll("_", "-") + " = " + colValue); + ctx.setAttribute(rsMeta.getColumnLabel(i + 1).replaceAll("_", "-"), colValue); + } + } + } + } + } + + // reserve is no-op + @Override + public QueryStatus reserve(String resource, String select, String key, String prefix, SvcLogicContext ctx) + throws SvcLogicException { + return (QueryStatus.SUCCESS); + } + + // release is no-op + @Override + public QueryStatus release(String resource, String key, SvcLogicContext ctx) throws SvcLogicException { + return (QueryStatus.SUCCESS); + } + + private QueryStatus executeSqlWrite(String key, SvcLogicContext ctx) throws SvcLogicException { + QueryStatus retval = QueryStatus.SUCCESS; + + DbLibService dblibSvc = getDbLibService(); + + if (dblibSvc == null) { + return (QueryStatus.FAILURE); + } + + String sqlStmt = resolveCtxVars(key, ctx); + + LOG.debug("key = [" + key + "]; sqlStmt = [" + sqlStmt + "]"); + try { + + if (!dblibSvc.writeData(sqlStmt, null, null)) { + retval = QueryStatus.FAILURE; + } + } catch (Exception e) { + LOG.error("Caught SQL exception", e); + retval = QueryStatus.FAILURE; + } + + return (retval); + + } + + private String resolveCtxVars(String key, SvcLogicContext ctx) { + if (key == null) { + return (null); + } + + 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+"); + + StringBuffer sqlBuffer = new StringBuffer(); + + for (int i = 0; i < keyTerms.length; i++) { + sqlBuffer.append(resolveTerm(keyTerms[i], ctx)); + sqlBuffer.append(" "); + } + + return (sqlBuffer.toString()); + } + + private String resolveTerm(String term, SvcLogicContext ctx) { + if (term == null) { + return (null); + } + + LOG.trace("resolveTerm: term is " + term); + + if (term.startsWith("$") && (ctx != null)) { + // Resolve any index variables. + term = resolveCtxVariable(term.substring(1), ctx); + // Escape single quote + if (term != null) { + term = term.replaceAll("'", "''"); + } + return ("'" + term + "'"); + } else { + return (term); + } + + } + + private String resolveCtxVariable(String ctxVarName, SvcLogicContext ctx) { + + if (ctxVarName.indexOf('[') == -1) { + // Ctx variable contains no arrays + if ("CRYPT_KEY".equals(ctxVarName)) { + // Handle crypt key as special case. If it's set as a context + // variable, use it. Otherwise, use + // configured crypt key. + String cryptKey = ctx.getAttribute(ctxVarName); + if ((cryptKey != null) && (cryptKey.length() > 0)) { + return (cryptKey); + } else { + return (CRYPT_KEY); + } + } + 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())); + } + + @Override + public QueryStatus save(String resource, boolean force, boolean localOnly, String key, Map parms, + String prefix, SvcLogicContext ctx) throws SvcLogicException { + return (executeSqlWrite(key, ctx)); + } + + private DbLibService getDbLibService() { + // Try to get dblib as an OSGI service + DbLibService dblibSvc = null; + BundleContext bctx = null; + ServiceReference sref = null; + + Bundle bundle = FrameworkUtil.getBundle(SqlResource.class); + + if (bundle != null) { + bctx = bundle.getBundleContext(); + } + + if (bctx != null) { + sref = bctx.getServiceReference(DBLIB_SERVICE); + } + + if (sref == null) { + LOG.warn("Could not find service reference for DBLIB service (" + DBLIB_SERVICE + ")"); + } else { + dblibSvc = (DbLibService) bctx.getService(sref); + if (dblibSvc == null) { + LOG.warn("Could not find service reference for DBLIB service (" + DBLIB_SERVICE + ")"); + } + } + + if (dblibSvc == null) { + // Must not be running in an OSGI container. See if you can load it + // as a + // a POJO then. + try { + dblibSvc = DBResourceManager.create(System.getProperties()); + } catch (Exception e) { + LOG.error("Caught exception trying to create dblib service", e); + } + + if (dblibSvc == null) { + LOG.warn("Could not create new DBResourceManager"); + } + } + + return (dblibSvc); + } + + @Override + public QueryStatus notify(String resource, String action, String key, SvcLogicContext ctx) + throws SvcLogicException { + if (LOG.isDebugEnabled()) { + LOG.debug("SqlResource.notify called with resource=" + resource + ", action=" + action); + } + return QueryStatus.SUCCESS; + } + + @Override + public QueryStatus delete(String resource, String key, SvcLogicContext ctx) throws SvcLogicException { + return (executeSqlWrite(key, ctx)); + } + + public QueryStatus update(String resource, String key, Map parms, String prefix, + SvcLogicContext ctx) throws SvcLogicException { + return (executeSqlWrite(key, ctx)); + } + + private String decryptColumn(String tableName, String colName, byte[] colValue, DbLibService dblibSvc) { + String strValue = new String(colValue); + + if (StringUtils.isAsciiPrintable(strValue)) { + + // If printable, not encrypted + return (strValue); + } else { + PreparedStatement stmt = null; + Connection conn = null; + ResultSet results = null; + try { + // CachedRowSet results = + // dblibSvc.getData("SELECT + // CAST(AES_DECRYPT('"+strValue+"','"+CRYPT_KEY+"') AS CHAR(50)) + // FROM DUAL", + // null, null); + conn = ((DBResourceManager) dblibSvc).getConnection(); + + stmt = conn.prepareStatement("SELECT CAST(AES_DECRYPT(?, ?) AS CHAR(50)) FROM DUAL"); + + stmt.setBytes(1, colValue); + stmt.setString(2, getCryptKey()); + + results = stmt.executeQuery(); + + if ((results != null) && results.next()) { + strValue = results.getString(1); + LOG.debug("Decrypted value is " + strValue); + } else { + LOG.warn("Cannot decrypt " + tableName + "." + colName); + } + } catch (Exception e) { + LOG.error("Caught exception trying to decrypt " + tableName + "." + colName, e); + } finally { + try { + if (results != null) { + results.close(); + results = null; + } + } catch (Exception exc) { + + } + + try { + if (stmt != null) { + stmt.close(); + stmt = null; + } + } catch (Exception exc) { + + } + + try { + if (conn != null) { + conn.close(); + conn = null; + } + } catch (Exception exc) { + + } + + } + } + return (strValue); + } + + public static String getCryptKey() { + return (CRYPT_KEY); + } + + public static String setCryptKey(String key) { + CRYPT_KEY = key; + return (CRYPT_KEY); + } + + public String parameterizedQuery(Map parameters, SvcLogicContext ctx) throws SvcLogicException { + DbLibService dblibSvc = getDbLibService(); + String prefix = parameters.get("prefix"); + String query = parameters.get("query"); + + ArrayList arguments = new ArrayList(); + for (Entry a : parameters.entrySet()) { + if (a.getKey().startsWith("param")) { + arguments.add(a.getValue()); + } + } + + try { + if (dblibSvc == null) { + return mapQueryStatus(QueryStatus.FAILURE); + } + if (query.contains("count") || query.contains("COUNT")) { + CachedRowSet results = dblibSvc.getData(query, arguments, null); + + if (!results.next()) { + return mapQueryStatus(QueryStatus.FAILURE); + } + + int numRows = results.getInt(1); + ctx.setAttribute(prefix + ".count", String.valueOf(numRows)); + if (numRows > 0) { + return "true"; + } else { + return "false"; + } + } else if (query.startsWith("select") || query.startsWith("SELECT")) { + CachedRowSet results = dblibSvc.getData(query, arguments, null); + if (!results.next()) { + return mapQueryStatus(QueryStatus.NOT_FOUND); + } else { + saveCachedRowSetToCtx(results, ctx, prefix, dblibSvc); + } + } else { + if (!dblibSvc.writeData(query, arguments, null)) { + return mapQueryStatus(QueryStatus.FAILURE); + } + } + return mapQueryStatus(QueryStatus.SUCCESS); + } catch (SQLException e) { + LOG.error("Caught SQL exception", e); + return mapQueryStatus(QueryStatus.FAILURE); + } + } + + protected String mapQueryStatus(QueryStatus status) { + String str = status.toString(); + str = str.toLowerCase(); + str = str.replaceAll("_", "-"); + return str; + } +} diff --git a/sql-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/sql/SqlResourceActivator.java b/sql-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/sql/SqlResourceActivator.java new file mode 100644 index 00000000..e1994b2e --- /dev/null +++ b/sql-resource/provider/src/main/java/org/openecomp/sdnc/sli/resource/sql/SqlResourceActivator.java @@ -0,0 +1,96 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.resource.sql; + +import java.io.File; +import java.io.FileInputStream; +import java.util.Properties; + +import org.onap.ccsdk.sli.core.sli.SvcLogicResource; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SqlResourceActivator implements BundleActivator { + + private static final String SQLRESOURCE_PROP_PATH = "/sql-resource.properties"; + + private ServiceRegistration registration = null; + + private static final Logger LOG = LoggerFactory + .getLogger(SqlResourceActivator.class); + + @Override + public void start(BundleContext ctx) throws Exception { + + String cfgDir = System.getenv("SDNC_CONFIG_DIR"); + + if ((cfgDir == null) || (cfgDir.length() == 0)) { + cfgDir = "/opt/sdnc/data/properties"; + LOG.warn("SDNC_CONFIG_DIR unset - defaulting to "+cfgDir); + } + + String cryptKey = ""; + + File sqlResourcePropFile = new File(cfgDir+SQLRESOURCE_PROP_PATH); + Properties sqlResourceProps = new Properties(); + if (sqlResourcePropFile.exists()) { + try { + + sqlResourceProps.load(new FileInputStream(sqlResourcePropFile)); + + cryptKey = sqlResourceProps.getProperty("org.openecomp.sdnc.resource.sql.cryptkey"); + } catch (Exception e) { + LOG.warn( + "Could not load properties file " + sqlResourcePropFile.getAbsolutePath(), e); + } + } else { + LOG.warn("Cannot read "+sqlResourcePropFile.getAbsolutePath()+" to find encryption key - using default"); + } + + SqlResource.setCryptKey(cryptKey); + + // Advertise Sql resource adaptor + SvcLogicResource impl = new SqlResource(); + String regName = impl.getClass().getName(); + + if (registration == null) + { + LOG.debug("Registering SqlResource service "+regName); + registration =ctx.registerService(regName, impl, null); + } + + } + + @Override + public void stop(BundleContext ctx) throws Exception { + + if (registration != null) + { + registration.unregister(); + registration = null; + } + } + +} diff --git a/sql-resource/provider/src/main/resources/svclogic.properties b/sql-resource/provider/src/main/resources/svclogic.properties new file mode 100644 index 00000000..a7948fc5 --- /dev/null +++ b/sql-resource/provider/src/main/resources/svclogic.properties @@ -0,0 +1,34 @@ +### +# ============LICENSE_START======================================================= +# openECOMP : SDN-C +# ================================================================================ +# Copyright (C) 2017 ONAP 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========================================================= +### + +org.openecomp.sdnc.sli.dbtype=jdbc +org.openecomp.sdnc.sli.jdbc.hosts=sdnctldb01,sdnctldb02 +org.openecomp.sdnc.sli.jdbc.url=jdbc:mysql://DBHOST:3306/sdnctl +org.openecomp.sdnc.sli.jdbc.database=sdnctl +org.openecomp.sdnc.sli.jdbc.user=sdnctl +org.openecomp.sdnc.sli.jdbc.password=gamma +org.openecomp.sdnc.sli.jdbc.connection.name=sdnctldb01 + +org.openecomp.sdnc.sli.jdbc.connection.timeout=50 +org.openecomp.sdnc.sli.jdbc.request.timeout=100 +org.openecomp.sdnc.sli.jdbc.limit.init=10 +org.openecomp.sdnc.sli.jdbc.limit.min=10 +org.openecomp.sdnc.sli.jdbc.limit.max=20 diff --git a/sql-resource/provider/src/test/java/org/openecomp/sdnc/sli/resource/sql/SqlResourceTest.java b/sql-resource/provider/src/test/java/org/openecomp/sdnc/sli/resource/sql/SqlResourceTest.java new file mode 100644 index 00000000..5b35f5aa --- /dev/null +++ b/sql-resource/provider/src/test/java/org/openecomp/sdnc/sli/resource/sql/SqlResourceTest.java @@ -0,0 +1,218 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 ONAP 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.resource.sql; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Enumeration; +import java.util.Properties; + +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicResource.QueryStatus; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import junit.framework.TestCase; + +public class SqlResourceTest extends TestCase { + + private static final Logger LOG = LoggerFactory + .getLogger(SqlResourceTest.class); + + + public void testExists() { + + + Properties props = new Properties(); + InputStream propStr = getClass().getResourceAsStream("/svclogic.properties"); + if (propStr == null) { + fail("src/test/resources/svclogic.properties missing"); + } + + try { + props.load(propStr); + propStr.close(); + } catch (Exception e) { + e.printStackTrace(); + fail("Could not initialize properties"); + } + + // Add properties to global properties + + Enumeration propNames = props.keys(); + + while (propNames.hasMoreElements()) { + String propName = (String) propNames.nextElement(); + + System.setProperty(propName, props.getProperty(propName)); + } + + SqlResource sqlResource = new SqlResource(); + + + + InputStream testStr = getClass().getResourceAsStream("/save.tests"); + BufferedReader testsReader = new BufferedReader(new InputStreamReader(testStr)); + SvcLogicContext ctx = new SvcLogicContext(); + + try { + String testExpr = null; + + int testNum = 0; + while ((testExpr = testsReader.readLine()) != null) { + testExpr = testExpr.trim(); + + if (testExpr.startsWith("#")) { + testExpr = testExpr.substring(1).trim(); + String[] nameValue = testExpr.split("="); + String name = nameValue[0].trim(); + String value = nameValue[1].trim(); + + LOG.info("Setting context attribute " + name + " = " + + value); + ctx.setAttribute(name, value); + + } else { + + testNum++; + String sqlStmt = testExpr; + QueryStatus status = sqlResource.save("SQL", true, false, sqlStmt, null, "savetest"+testNum, ctx); + + switch (status) { + case SUCCESS: + LOG.info("Found data for query [" + sqlStmt + "]"); + break; + case NOT_FOUND: + LOG.info("Did not data for query [" + sqlStmt + "]"); + break; + default: + fail("Failure executing query [" + sqlStmt + "]"); + + } + } + } + + } catch (Exception e) { + e.printStackTrace(); + fail("Caught exception running tests"); + } + + + testStr = getClass().getResourceAsStream("/query.tests"); + testsReader = new BufferedReader(new InputStreamReader(testStr)); + + try { + String testExpr = null; + + int testNum = 0; + while ((testExpr = testsReader.readLine()) != null) { + testExpr = testExpr.trim(); + if (testExpr.startsWith("#")) { + testExpr = testExpr.substring(1).trim(); + String[] nameValue = testExpr.split("="); + String name = nameValue[0].trim(); + String value = nameValue[1].trim(); + + LOG.info("Setting context attribute " + name + " = " + + value); + ctx.setAttribute(name, value); + + } else { + + testNum++; + + String sqlStmt = testExpr; + QueryStatus status = sqlResource.query("SQL", false, null, + sqlStmt, "querytest" + testNum, null, ctx); + + switch (status) { + case SUCCESS: + LOG.info("Found data for query [" + sqlStmt + "]"); + break; + case NOT_FOUND: + LOG.info("Did not data for query [" + sqlStmt + "]"); + break; + default: + fail("Failure executing query [" + sqlStmt + "]"); + + } + } + } + + } catch (Exception e) { + e.printStackTrace(); + fail("Caught exception running tests"); + } + + + testStr = getClass().getResourceAsStream("/delete.tests"); + testsReader = new BufferedReader(new InputStreamReader(testStr)); + + try { + String testExpr = null; + + int testNum = 0; + while ((testExpr = testsReader.readLine()) != null) { + testExpr = testExpr.trim(); + if (testExpr.startsWith("#")) { + testExpr = testExpr.substring(1).trim(); + String[] nameValue = testExpr.split("="); + String name = nameValue[0].trim(); + String value = nameValue[1].trim(); + + LOG.info("Setting context attribute " + name + " = " + + value); + ctx.setAttribute(name, value); + + } else { + + testNum++; + + String sqlStmt = testExpr; + QueryStatus status = sqlResource.delete("SQL", sqlStmt, ctx); + + switch (status) { + case SUCCESS: + LOG.info("Found data for query [" + sqlStmt + "]"); + break; + case NOT_FOUND: + LOG.info("Did not data for query [" + sqlStmt + "]"); + break; + default: + fail("Failure executing query [" + sqlStmt + "]"); + + } + } + } + + } catch (Exception e) { + e.printStackTrace(); + fail("Caught exception running tests"); + } + + for (String attrName : ctx.getAttributeKeySet()) { + LOG.info("ctx.getAttribute("+attrName+") = "+ctx.getAttribute(attrName)); + } + } + +} diff --git a/sql-resource/provider/src/test/resources/delete.tests b/sql-resource/provider/src/test/resources/delete.tests new file mode 100755 index 00000000..a60a3bc7 --- /dev/null +++ b/sql-resource/provider/src/test/resources/delete.tests @@ -0,0 +1,2 @@ +DROP TABLE SQLRESOURCE_ORDER; +DROP TABLE SQLRESOURCE_ORDER_ITEM; diff --git a/sql-resource/provider/src/test/resources/query.tests b/sql-resource/provider/src/test/resources/query.tests new file mode 100755 index 00000000..ec05c22e --- /dev/null +++ b/sql-resource/provider/src/test/resources/query.tests @@ -0,0 +1,5 @@ +# max-price = 100 +SELECT * FROM SQLRESOURCE_ORDER where placed_on < now(); +SELECT SQLRESOURCE_ORDER.order_number, clli, service, price FROM SQLRESOURCE_ORDER, SQLRESOURCE_ORDER_ITEM where SQLRESOURCE_ORDER.order_number = SQLRESOURCE_ORDER_ITEM.order_number and price > $max-price ; +SELECT SQLRESOURCE_ORDER.order_number, clli, service, price FROM SQLRESOURCE_ORDER, SQLRESOURCE_ORDER_ITEM where SQLRESOURCE_ORDER.order_number = SQLRESOURCE_ORDER_ITEM.order_number and price < $max-price ; +SELECT SQLRESOURCE_ORDER.order_number AS ordernum, clli, service, price FROM SQLRESOURCE_ORDER, SQLRESOURCE_ORDER_ITEM where SQLRESOURCE_ORDER.order_number = SQLRESOURCE_ORDER_ITEM.order_number and price < $max-price ; diff --git a/sql-resource/provider/src/test/resources/save.tests b/sql-resource/provider/src/test/resources/save.tests new file mode 100755 index 00000000..e2c42217 --- /dev/null +++ b/sql-resource/provider/src/test/resources/save.tests @@ -0,0 +1,13 @@ +# order-number = 1234 +# zero = 0 +# item[0].clli = MTJNJA14 +# item[0].service = NoD +# item[0].price = 1000000 +# item[1].clli = MTJNJA14 +# item[1].service = Pizza +# item[1].price = 10 +CREATE TABLE IF NOT EXISTS SQLRESOURCE_ORDER (order_number VARCHAR(40), placed_on TIMESTAMP); +CREATE TABLE IF NOT EXISTS SQLRESOURCE_ORDER_ITEM (order_number VARCHAR(40), clli VARCHAR(40), service VARCHAR(40), price INTEGER(4)); +INSERT INTO SQLRESOURCE_ORDER VALUES ( $order-number , now()); +INSERT INTO SQLRESOURCE_ORDER_ITEM VALUES( $order-number , $item[$zero].clli , $item[0].service , $item[0].price ); +INSERT INTO SQLRESOURCE_ORDER_ITEM VALUES( $order-number , $item[1].clli , $item[1].service , $item[1].price ); diff --git a/sql-resource/provider/src/test/resources/simplelogger.properties b/sql-resource/provider/src/test/resources/simplelogger.properties new file mode 100644 index 00000000..b28e4578 --- /dev/null +++ b/sql-resource/provider/src/test/resources/simplelogger.properties @@ -0,0 +1,22 @@ +### +# ============LICENSE_START======================================================= +# openECOMP : SDN-C +# ================================================================================ +# Copyright (C) 2017 ONAP 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========================================================= +### + +org.slf4j.simpleLogger.defaultLogLevel=debug diff --git a/sql-resource/provider/src/test/resources/svclogic.properties b/sql-resource/provider/src/test/resources/svclogic.properties new file mode 100644 index 00000000..16ac91c9 --- /dev/null +++ b/sql-resource/provider/src/test/resources/svclogic.properties @@ -0,0 +1,34 @@ +### +# ============LICENSE_START======================================================= +# openECOMP : SDN-C +# ================================================================================ +# Copyright (C) 2017 ONAP 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========================================================= +### + +org.openecomp.sdnc.sli.dbtype=jdbc +org.openecomp.sdnc.sli.jdbc.hosts=localhost +org.openecomp.sdnc.sli.jdbc.url=jdbc:mysql://DBHOST:3306/sdnctl +org.openecomp.sdnc.sli.jdbc.database=sdnctl +org.openecomp.sdnc.sli.jdbc.user=sdnctl +org.openecomp.sdnc.sli.jdbc.password=gamma +org.openecomp.sdnc.sli.jdbc.connection.name=sdnctldb01 + +org.openecomp.sdnc.sli.jdbc.connection.timeout=50 +org.openecomp.sdnc.sli.jdbc.request.timeout=100 +org.openecomp.sdnc.sli.jdbc.limit.init=10 +org.openecomp.sdnc.sli.jdbc.limit.min=10 +org.openecomp.sdnc.sli.jdbc.limit.max=20 diff --git a/version.properties b/version.properties new file mode 100644 index 00000000..70925039 --- /dev/null +++ b/version.properties @@ -0,0 +1,14 @@ +########################################################### +# Versioning variables +# Note that these variables cannot be structured (e.g. : version.release or version.snapshot etc... ) +# because they are used in Jenkins, whose plug-in doesn't support + +release_name=0 +sprint_number=0 +feature_revision=1 + +base_version=${release_name}.${sprint_number}.${feature_revision} + +release_version=${base_version} +snapshot_version=${base_version}-SNAPSHOT +