aboutsummaryrefslogtreecommitdiffstats
path: root/resource-assignment/provider
diff options
context:
space:
mode:
Diffstat (limited to 'resource-assignment/provider')
-rwxr-xr-xresource-assignment/provider/pom.xml115
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/comp/LockHelper.java35
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/comp/LockHelperImpl.java166
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/comp/ResourceLockedException.java41
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/comp/SynchronizedFunction.java56
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/dao/ResourceLockDao.java43
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/dao/ResourceLockDaoImpl.java115
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/lock/data/ResourceLock.java34
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/ReleaseRequestType.java45
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/ReserveRequestType.java43
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/ResourceAllocator.java1016
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/alloc/AffinityAllocationRule.java68
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/alloc/DbAllocationRule.java155
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/alloc/ServingSiteAllocationRule.java80
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/alloc/VrfAllocationRule.java111
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/AnyVrfPresentCheck.java74
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/ExcludeVpeCheck.java57
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/HubWithRgCheck.java107
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/OneMVrfCheck.java100
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/ProvStatusCheck.java49
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/VlanSpeedCheck.java50
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/check/VpeLockCheck.java111
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/AllocationRule.java37
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/EndPointAllocationDefinition.java60
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/EndPointAllocator.java35
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/EndPointAllocatorImpl.java214
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/EndPointData.java33
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/EquipmentCheck.java35
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/PreferenceRule.java30
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/comp/ServiceData.java36
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/comp/EquipmentReader.java32
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/ServerDao.java30
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/ServerDaoImpl.java64
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/VpePortDao.java32
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/VpePortDaoImpl.java81
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/VplspePortDao.java30
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/dao/VplspePortDaoImpl.java70
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/data/EquipmentData.java31
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/equip/data/EquipmentLevel.java26
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/pref/AffinityLinkPref.java85
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/pref/EvcExistingVrfPref.java60
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/reader/AicSiteReader.java49
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/reader/UplinkCircuitReader.java54
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/reader/VnfReader.java49
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/reader/VpePortReader.java70
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/comp/AllocationRequestBuilder.java42
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/comp/AllocationRequestBuilderImpl.java172
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/MaxPortSpeedDao.java28
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/MaxPortSpeedDaoImpl.java85
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/MaxServerSpeedDao.java28
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/MaxServerSpeedDaoImpl.java86
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/ParameterDao.java27
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/ParameterDaoImpl.java57
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/RangeRuleDao.java32
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/RangeRuleDaoImpl.java70
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/ResourceRuleDao.java38
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/ResourceRuleDaoImpl.java117
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/VpeLockDao.java27
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/dao/VpeLockDaoImpl.java48
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/data/RangeRule.java33
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/data/ResourceRule.java39
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/data/ResourceThreshold.java28
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/rule/data/ThresholdStatus.java32
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/service/dao/ServiceResourceDao.java38
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/service/dao/ServiceResourceDaoImpl.java110
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/service/data/ServiceResource.java32
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/ra/service/data/ServiceStatus.java27
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/comp/AllocationFunction.java330
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/comp/ReleaseFunction.java88
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/comp/ResourceLoader.java39
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/comp/ResourceManager.java41
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/comp/ResourceManagerImpl.java128
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/ResourceDao.java39
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/AllocationItem.java37
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/AllocationItemJdbcDao.java35
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/AllocationItemJdbcDaoImpl.java126
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/Resource.java32
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceDaoImpl.java370
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceJdbcDao.java39
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceJdbcDaoImpl.java144
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceLoad.java33
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceLoadJdbcDao.java36
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/dao/jdbc/ResourceLoadJdbcDaoImpl.java112
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/AllocationAction.java26
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/AllocationItem.java36
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/AllocationOutcome.java28
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/AllocationRequest.java35
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/AllocationStatus.java27
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/InitAction.java36
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LabelAllocationItem.java27
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LabelAllocationOutcome.java28
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LabelAllocationRequest.java29
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LabelResource.java30
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LimitAllocationItem.java27
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LimitAllocationOutcome.java29
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LimitAllocationRequest.java31
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/LimitResource.java27
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/MultiAssetAllocationOutcome.java30
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/MultiAssetAllocationRequest.java32
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/MultiResourceAllocationOutcome.java29
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/MultiResourceAllocationRequest.java30
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/RangeAllocationItem.java29
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/RangeAllocationOutcome.java30
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/RangeAllocationRequest.java36
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/RangeResource.java29
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/Resource.java32
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/ResourceKey.java50
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/ResourceLoad.java32
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/data/ResourceType.java26
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/util/LabelUtil.java95
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/util/LimitUtil.java334
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/util/RangeUtil.java110
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/rm/util/ResourceUtil.java49
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/db/CachedDataSourceWrap.java122
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/db/ConnectionWrap.java338
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/db/DataSourceWrap.java98
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/expr/ExpressionEvaluator.java207
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/speed/SpeedUtil.java41
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/str/StrUtil.java305
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/vrf/VpnParam.java30
-rw-r--r--resource-assignment/provider/src/main/java/org/openecomp/sdnc/util/vrf/VrfUtil.java76
-rw-r--r--resource-assignment/provider/src/main/resources/META-INF/spring/resource-assignment-context.xml296
-rw-r--r--resource-assignment/provider/src/main/resources/META-INF/spring/resource-assignment-osgi-context.xml39
-rw-r--r--resource-assignment/provider/src/main/resources/resource-allocator.properties26
-rw-r--r--resource-assignment/provider/src/main/resources/sql/001_resource_rule_ddl.sql32
-rw-r--r--resource-assignment/provider/src/main/resources/sql/002_max_port_speed_ddl.sql29
-rw-r--r--resource-assignment/provider/src/main/resources/sql/003_max_server_speed_ddl.sql28
-rw-r--r--resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/DataSetup.java261
-rw-r--r--resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/TestIsAvailable.java424
-rw-r--r--resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/TestQuery.java85
-rw-r--r--resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/TestRelease.java430
-rw-r--r--resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/TestReserve.java681
-rw-r--r--resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/ra/TestReserve2.java77
-rw-r--r--resource-assignment/provider/src/test/java/jtest/org/openecomp/sdnc/rm/DataSetup.java106
-rw-r--r--resource-assignment/provider/src/test/java/jtest/util/org/openecomp/sdnc/ra/TestDb.java37
-rw-r--r--resource-assignment/provider/src/test/java/jtest/util/org/openecomp/sdnc/ra/TestTable.java84
-rw-r--r--resource-assignment/provider/src/test/resources/homing-req.json46
-rw-r--r--resource-assignment/provider/src/test/resources/log4j.properties26
-rwxr-xr-xresource-assignment/provider/src/test/resources/param.txt44
-rw-r--r--resource-assignment/provider/src/test/resources/sql/data.sql120
-rw-r--r--resource-assignment/provider/src/test/resources/sql/schema.sql201
-rw-r--r--resource-assignment/provider/src/test/resources/svc-topology-req.json195
-rw-r--r--resource-assignment/provider/src/test/resources/test-context.xml297
143 files changed, 12909 insertions, 0 deletions
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.openecomp.sdnc.adaptors</groupId>
+ <artifactId>resource-assignment</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </parent>
+ <artifactId>resource-assignment-provider</artifactId>
+ <packaging>bundle</packaging>
+ <name>Resource Assignment Adaptor - Provider</name>
+ <url>http://maven.apache.org</url>
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ <version>${junit.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-test</artifactId>
+ <version>${spring.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.h2database</groupId>
+ <artifactId>h2</artifactId>
+ <version>${h2database.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.onap.ccsdk.sli.core</groupId>
+ <artifactId>sli-common</artifactId>
+ <version>${sdnctl.sli.version}</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.onap.ccsdk.sli.core</groupId>
+ <artifactId>sli-provider</artifactId>
+ <version>${sdnctl.sli.version}</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.onap.ccsdk.sli.core</groupId>
+ <artifactId>dblib-provider</artifactId>
+ <version>${sdnctl.dblib.version}</version>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>${slf4j.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>jcl-over-slf4j</artifactId>
+ <version>${slf4j.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>mysql</groupId>
+ <artifactId>mysql-connector-java</artifactId>
+ <version>${mysql.connector.version}</version>
+ <type>jar</type>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-beans</artifactId>
+ <version>${spring.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-context</artifactId>
+ <version>${spring.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-jdbc</artifactId>
+ <version>${spring.version}</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+
+
+
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>${bundle.plugin.version}</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-SymbolicName>org.openecomp.sdnc.ra</Bundle-SymbolicName>
+ <Export-Package>org.openecomp.sdnc.ra</Export-Package>
+ <Import-Package>*,org.openecomp.sdnc.sli.resource.dblib,org.openecomp.sdnc.sli.*,org.osgi.framework.*,org.slf4j.*,com.mysql.jdbc.*</Import-Package>
+ <!--Import-Package>*</Import-Package-->
+ <Embed-Transitive>true</Embed-Transitive>
+ </instructions>
+
+
+ </configuration>
+
+ </plugin>
+
+
+ </plugins>
+
+ </build>
+</project>
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<String> resourceNameList, String lockRequester, int lockTimeout /* Seconds */);
+
+ void unlock(Collection<String> 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<String> 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<String> 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<String> 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<ResourceLock> dbLockList = new ArrayList<ResourceLock>();
+ List<String> insertLockNameList = new ArrayList<String>();
+ 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<String> synchset;
+ private String lockRequester;
+ private int lockTimeout; // Seconds
+ private LockHelper lockHelper;
+
+ protected SynchronizedFunction(LockHelper lockHelper, Collection<String> synchset, int lockTimeout) {
+ this.lockHelper = lockHelper;
+ this.synchset = new HashSet<String>(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<ResourceLock> ll = jdbcTemplate.query("SELECT * FROM RESOURCE_LOCK WHERE resource_name = ?",
+ new Object[] { resourceName }, new RowMapper<ResourceLock>() {
+
+ @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<String, String> 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<String, String> 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<Resource> 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<String, Object> 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<Map<String, Object>> vpePortData = vpePortDao.getVpePortData(aicSiteId);
+ List<Map<String, Object>> vplspePortData = vplspePortDao.getVplspePortData(aicSiteId);
+ List<Map<String, Object>> serverData = serverDao.getServerData(aicSiteId);
+
+ vpePortData = orderVpe(vpePortData);
+
+ long maxAvailableSpeedVpePort = 0;
+ boolean vpePortFound = false;
+
+ for (Map<String, Object> 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<String> 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<String, Object> 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<String, Object> 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<Map<String, Object>> orderVpe(List<Map<String, Object>> vpePortData) {
+ for (Map<String, Object> 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<Map<String, Object>>() {
+
+ @Override
+ public int compare(Map<String, Object> o1, Map<String, Object> 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<String, Object> service = getServiceData(ctx);
+ Map<String, Object> 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<EndPointData> 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<String, Object> getServiceData(SvcLogicContext ctx) throws SvcLogicException {
+ Map<String, Object> sd = new HashMap<String, Object>();
+
+ 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<String, Object> getEquipConstraints(SvcLogicContext ctx) throws SvcLogicException {
+ Map<String, Object> mm = new HashMap<String, Object>();
+
+ 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<Map<String, Object>> 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<String, Object> uplinkCircuit = new HashMap<String, Object>();
+ 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<ResourceRule> resourceRuleList = resourceRuleDao.getResourceRules(serviceData.serviceModel,
+ endPointPosition, equipmentData.equipmentLevel);
+ List<RangeRule> rangeRuleList =
+ rangeRuleDao.getRangeRules(serviceData.serviceModel, endPointPosition, equipmentData.equipmentLevel);
+
+ List<AllocationRequest> arlist = new ArrayList<AllocationRequest>();
+
+ 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<String> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<EquipmentCheck> equipmentCheckList;
+ public List<PreferenceRule> preferenceRuleList;
+ public List<AllocationRule> 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<EquipmentCheck> equipmentCheckList) {
+ this.equipmentCheckList = equipmentCheckList;
+ }
+
+ public void setPreferenceRuleList(List<PreferenceRule> preferenceRuleList) {
+ this.preferenceRuleList = preferenceRuleList;
+ }
+
+ public void setAllocationRuleList(List<AllocationRule> 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<EndPointData> allocateEndPoints(
+ ServiceData serviceData,
+ Map<String, Object> 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<String, List<EndPointAllocationDefinition>> endPointAllocationDefinitionMap;
+
+ private ResourceManager resourceManager;
+
+ @Override
+ public List<EndPointData> allocateEndPoints(
+ ServiceData serviceData,
+ Map<String, Object> equipmentConstraints,
+ boolean checkOnly,
+ boolean change,
+ int changeNumber) {
+ List<EndPointAllocationDefinition> defList = endPointAllocationDefinitionMap.get(serviceData.serviceModel);
+ if (defList == null)
+ throw new NotImplementedException("Service model: " + serviceData.serviceModel + " not supported");
+
+ List<EndPointData> 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<EquipmentData> 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<EquipmentData> 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<PrefEquipment> 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<Resource> 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<PrefEquipment> {
+
+ 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<String, List<EndPointAllocationDefinition>> 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<String, Object> 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<String, Object> 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<String, Object> 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<EquipmentData> readEquipment(Map<String, Object> 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<Map<String, Object>> 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<Map<String, Object>> getServerData(String aicSiteId) {
+ List<Map<String, Object>> ll = new ArrayList<Map<String, Object>>();
+ Map<String, Object> sd = new HashMap<String, Object>();
+ 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<Map<String, Object>> getVpePortData(String aicSiteId);
+
+ List<Map<String, Object>> 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<Map<String, Object>> getVpePortData(String aicSiteId) {
+ return jdbcTemplate.query(GET_SQL, new Object[] { aicSiteId }, new VpePortRowMapper());
+ }
+
+ @Override
+ public List<Map<String, Object>> 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<Map<String, Object>> {
+
+ @Override
+ public Map<String, Object> mapRow(ResultSet rs, int rowNum) throws SQLException {
+ Map<String, Object> mm = new HashMap<String, Object>();
+ 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<Map<String, Object>> 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<Map<String, Object>> getVplspePortData(String aicSiteId) {
+ List<Map<String, Object>> ll =
+ jdbcTemplate.query(GET_SQL, new Object[] { aicSiteId }, new RowMapper<Map<String, Object>>() {
+
+ @Override
+ public Map<String, Object> mapRow(ResultSet rs, int rowNum) throws SQLException {
+ Map<String, Object> mm = new HashMap<String, Object>();
+ 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<String, Object> 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<String> 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<String> 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<EquipmentData> readEquipment(Map<String, Object> equipmentConstraints) {
+ String aicSiteId = (String) equipmentConstraints.get("aic-site-id");
+
+ EquipmentData equipData = new EquipmentData();
+ equipData.equipmentLevel = EquipmentLevel.Site;
+ equipData.equipmentId = aicSiteId;
+ equipData.data = new HashMap<String, Object>();
+
+ List<EquipmentData> 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<EquipmentData> readEquipment(Map<String, Object> equipmentConstraints) {
+ List<EquipmentData> equipList = new ArrayList<>();
+
+ List<Map<String, Object>> uplinkCircuitList =
+ (List<Map<String, Object>>) equipmentConstraints.get("uplink-circuit-list");
+ if (uplinkCircuitList == null || uplinkCircuitList.isEmpty())
+ return equipList;
+
+ for (Map<String, Object> 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<EquipmentData> readEquipment(Map<String, Object> equipmentConstraints) {
+ String vnfName = (String) equipmentConstraints.get("vnf-name");
+
+ EquipmentData equipData = new EquipmentData();
+ equipData.equipmentLevel = EquipmentLevel.Device;
+ equipData.equipmentId = vnfName;
+ equipData.data = new HashMap<String, Object>();
+
+ List<EquipmentData> 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<EquipmentData> readEquipment(Map<String, Object> 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<Map<String, Object>> vpeDataList = vpePortDao.getVpePortData(clli, vpeName);
+
+ List<EquipmentData> equipList = new ArrayList<>();
+ for (Map<String, Object> 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<ResourceRule> resourceRuleList = resourceRuleDao.getResourceRules(serviceData.serviceModel,
+ serviceData.endPointPosition, equipmentData.equipmentLevel);
+ List<RangeRule> 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<AllocationRequest>();
+ 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<MaxPortSpeed> maxPortSpeedList =
+ jdbcTemplate.query(GET_SQL, new Object[] { imageFile, endPointPosition, interfaceName },
+ new RowMapper<MaxPortSpeed>() {
+
+ @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<MaxServerSpeed> maxServerSpeedList =
+ jdbcTemplate.query(GET_SQL, new Object[] { serverModel, evcCount }, new RowMapper<MaxServerSpeed>() {
+
+ @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<Map<String, Object>> 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<RangeRule> 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<RangeRule> getRangeRules(String serviceModel, String endPointPosition, EquipmentLevel equipLevel) {
+ List<RangeRule> rangeRuleList =
+ jdbcTemplate.query(GET_SQL, new Object[] { serviceModel, endPointPosition, equipLevel.toString() },
+ new RowMapper<RangeRule>() {
+
+ @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<ResourceRule> 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<ResourceRule> getResourceRules(
+ String serviceModel,
+ String endPointPosition,
+ EquipmentLevel equipLevel) {
+ List<ResourceRule> 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<ResourceRule> 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<ResourceRule> {
+
+ @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<ResourceThreshold> {
+
+ @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<String> 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<ResourceThreshold> 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<ServiceResource> serviceResourceList =
+ jdbcTemplate.query(GET_SQL, new Object[] { serviceInstanceId, serviceStatus.toString() },
+ new RowMapper<ServiceResource>() {
+
+ @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<Resource> updateList = new ArrayList<Resource>();
+
+ 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<String> getLockNames(AllocationRequest request) {
+ Set<String> lockResourceNames = new HashSet<String>();
+ addLockNames(lockResourceNames, request);
+ return lockResourceNames;
+ }
+
+ private static void addLockNames(Set<String> 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<AllocationOutcome>();
+ 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<Integer> 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<Integer>();
+ int foundCount = 0;
+
+ // First try to reuse the numbers already taken by the same resource union
+ SortedSet<Integer> 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<Integer> 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<Integer>();
+ 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<Integer>();
+
+ 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<String> lockNames, int lockTimeout) {
+ super(lockHelper, lockNames, lockTimeout);
+ this.resourceDao = resourceDao;
+ this.resourceSetId = resourceSetId;
+ this.resourceUnionId = resourceUnionId;
+ }
+
+ @Override
+ public void _exec() throws ResourceLockedException {
+ List<Resource> resourceList =
+ resourceSetId != null
+ ? resourceDao.getResourceSet(resourceSetId) : resourceDao.getResourceUnion(resourceUnionId);
+ for (Resource r : resourceList) {
+ boolean updated = false;
+ if (r.allocationItems != null) {
+ Iterator<AllocationItem> 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<Resource> resourceList, boolean force);
+
+ void loadResourcesForAsset(String applicationId, String assetId, Collection<Resource> 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<Resource> 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<Resource> getResourceUnion(String resourceUnionId) {
+ List<Resource> 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<Resource> resourceList = resourceDao.getResourceSet(resourceSetId);
+ if (resourceList == null || resourceList.isEmpty())
+ return;
+
+ Set<String> lockNames = getLockNames(resourceList);
+ ReleaseFunction releaseFunction =
+ new ReleaseFunction(lockHelper, resourceDao, resourceSetId, null, lockNames, lockTimeout);
+ releaseFunction.exec();
+ }
+
+ @Override
+ public void releaseResourceUnion(String resourceUnionId) {
+ List<Resource> resourceList = resourceDao.getResourceUnion(resourceUnionId);
+ if (resourceList == null || resourceList.isEmpty())
+ return;
+
+ Set<String> lockNames = getLockNames(resourceList);
+ ReleaseFunction releaseFunction =
+ new ReleaseFunction(lockHelper, resourceDao, null, resourceUnionId, lockNames, lockTimeout);
+ releaseFunction.exec();
+ }
+
+ private Set<String> getLockNames(List<Resource> resourceList) {
+ Set<String> lockNames = new HashSet<String>();
+ 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<Resource> getResourceSet(String resourceSetId);
+
+ List<Resource> 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<AllocationItem> 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<AllocationItem> getAllocationItems(long resourceId) {
+ if (resourceId <= 0)
+ return Collections.emptyList();
+
+ return jdbcTemplate.query(GET_SQL, new Object[] { resourceId }, allocationItemRowMapper);
+ }
+
+ private static class AllocationItemRowMapper implements RowMapper<AllocationItem> {
+
+ @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<AllocationItem> aiEntityList = allocationItemJdbcDao.getAllocationItems(rEntity.id);
+ r.allocationItems = new ArrayList<org.openecomp.sdnc.rm.data.AllocationItem>();
+ for (AllocationItem aiEntity : aiEntityList) {
+ org.openecomp.sdnc.rm.data.AllocationItem ai = createAllocationItem(r, aiEntity);
+ r.allocationItems.add(ai);
+ }
+
+ List<ResourceLoad> rlEntityList = resourceLoadJdbcDao.getResourceLoads(rEntity.id);
+ r.resourceLoadList = new ArrayList<org.openecomp.sdnc.rm.data.ResourceLoad>();
+ 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<AllocationItem> 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<ResourceLoad> 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<org.openecomp.sdnc.rm.data.Resource> getResourceSet(String resourceSetId) {
+ List<Resource> rEntityList = resourceJdbcDao.getResourceSet(resourceSetId);
+ List<org.openecomp.sdnc.rm.data.Resource> rlist = new ArrayList<org.openecomp.sdnc.rm.data.Resource>();
+ for (Resource rEntity : rEntityList) {
+ org.openecomp.sdnc.rm.data.Resource r = createResource(rEntity);
+ rlist.add(r);
+
+ List<AllocationItem> aiEntityList = allocationItemJdbcDao.getAllocationItems(rEntity.id);
+ r.allocationItems = new ArrayList<org.openecomp.sdnc.rm.data.AllocationItem>();
+ for (AllocationItem aiEntity : aiEntityList) {
+ org.openecomp.sdnc.rm.data.AllocationItem ai = createAllocationItem(r, aiEntity);
+ r.allocationItems.add(ai);
+ }
+
+ List<ResourceLoad> rlEntityList = resourceLoadJdbcDao.getResourceLoads(rEntity.id);
+ r.resourceLoadList = new ArrayList<org.openecomp.sdnc.rm.data.ResourceLoad>();
+ for (ResourceLoad rlEntity : rlEntityList) {
+ org.openecomp.sdnc.rm.data.ResourceLoad rl = createResourceLoad(r, rlEntity);
+ r.resourceLoadList.add(rl);
+ }
+ }
+ return rlist;
+ }
+
+ @Override
+ public List<org.openecomp.sdnc.rm.data.Resource> getResourceUnion(String resourceUnionId) {
+ List<Resource> rEntityList = resourceJdbcDao.getResourceUnion(resourceUnionId);
+ List<org.openecomp.sdnc.rm.data.Resource> rlist = new ArrayList<org.openecomp.sdnc.rm.data.Resource>();
+ for (Resource rEntity : rEntityList) {
+ org.openecomp.sdnc.rm.data.Resource r = createResource(rEntity);
+ rlist.add(r);
+
+ List<AllocationItem> aiEntityList = allocationItemJdbcDao.getAllocationItems(rEntity.id);
+ r.allocationItems = new ArrayList<org.openecomp.sdnc.rm.data.AllocationItem>();
+ for (AllocationItem aiEntity : aiEntityList) {
+ org.openecomp.sdnc.rm.data.AllocationItem ai = createAllocationItem(r, aiEntity);
+ r.allocationItems.add(ai);
+ }
+
+ List<ResourceLoad> rlEntityList = resourceLoadJdbcDao.getResourceLoads(rEntity.id);
+ r.resourceLoadList = new ArrayList<org.openecomp.sdnc.rm.data.ResourceLoad>();
+ 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<String>(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<Resource> getResourceSet(String resourceSetId);
+
+ List<Resource> 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<Resource> ll = jdbcTemplate.query(RESOURCE_SQL, new Object[] { assetId, resourceName }, resourceRowMapper);
+ return ll.isEmpty() ? null : ll.get(0);
+ }
+
+ @Override
+ public List<Resource> getResourceSet(String resourceSetId) {
+ if (resourceSetId == null)
+ return Collections.emptyList();
+
+ return jdbcTemplate.query(RESOURCE_SET_SQL, new Object[] { resourceSetId }, resourceRowMapper);
+ }
+
+ @Override
+ public List<Resource> 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<Resource> {
+
+ @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<ResourceLoad> 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<ResourceLoad> getResourceLoads(long resourceId) {
+ if (resourceId <= 0)
+ return Collections.emptyList();
+
+ return jdbcTemplate.query(GET_SQL, new Object[] { resourceId }, resourceLoadRowMapper);
+ }
+
+ private static class ResourceLoadRowMapper implements RowMapper<ResourceLoad> {
+
+ @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<String> 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<String> 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<String> goodAssetIdList;
+ public List<AllocationOutcome> 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<String> 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<AllocationOutcome> 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<AllocationRequest> 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<Integer> 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<Integer> allocated = null;
+ public SortedSet<Integer> 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<Integer> 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<Integer> 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<AllocationItem> allocationItems;
+ public Collection<ResourceLoad> 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<AllocationItem>();
+ 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<String> 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<String/* resourceUnionId */, List<LimitUsage>> limitUsageMap = new HashMap<String, List<LimitUsage>>();
+ 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<List<LimitUsage>> allCombinations = new ArrayList<List<LimitUsage>>();
+ for (String firstResourceUnion : limitUsageMap.keySet()) {
+ List<LimitUsage> limitUsageList = limitUsageMap.get(firstResourceUnion);
+ if (limitUsageList.size() > 1)
+ significantChangeCount++;
+ if (allCombinations.isEmpty()) {
+ for (LimitUsage limitUsage : limitUsageList) {
+ List<LimitUsage> newCombination = new ArrayList<LimitUsage>();
+ 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<LimitUsage> combination : allCombinations)
+ combination.add(limitUsageList.get(0));
+ } else {
+ // We have to duplicate each of the current combinations for each element of limitUsageList
+ List<List<LimitUsage>> newAllCombinations = new ArrayList<List<LimitUsage>>();
+ for (List<LimitUsage> combination : allCombinations)
+ for (LimitUsage limitUsage : limitUsageList) {
+ List<LimitUsage> newCombination = new ArrayList<LimitUsage>(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<LimitUsage> 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<String/* resourceUnionId */, List<LimitUsage>> limitUsageMap,
+ String resourceUnionId,
+ Set<String> resourceShareGroupList,
+ long used) {
+ List<LimitUsage> limitUsageList = limitUsageMap.get(resourceUnionId);
+ if (limitUsageList == null) {
+ limitUsageList = new ArrayList<LimitUsage>();
+ 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<String> 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<LimitUsage> 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<List<LimitUsage>> sharedSets = new ArrayList<List<LimitUsage>>();
+ 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<LimitUsage> 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<LimitUsage> newSharedSet = new ArrayList<LimitUsage>();
+ newSharedSet.add(limitUsage);
+ sharedSets.add(newSharedSet);
+ }
+ }
+
+ long sum = 0;
+ for (List<LimitUsage> 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<AllocationItem>();
+ 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<Integer>();
+ 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<Integer> getUsed(RangeResource r, String resourceUnionId) {
+ SortedSet<Integer> used = new TreeSet<Integer>();
+ 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<Integer> 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<AllocationItem>();
+ 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<ConnectionWrap> 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> T unwrap(Class<T> 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> T unwrap(Class<T> 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<String, Class<?>> getTypeMap() throws SQLException {
+ return cc.getTypeMap();
+ }
+
+ @Override
+ public void setTypeMap(Map<String, Class<?>> 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> T unwrap(Class<T> 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<String, Object> vars) {
+ return (long) evalFloat(expr, vars);
+ }
+
+ public static float evalFloat(String expr, Map<String, Object> 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<String, Object> 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<? extends Object> 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<Integer> listInt(String ss, String warning) {
+ if (ss == null || ss.length() == 0)
+ return null;
+
+ SortedSet<Integer> ll = new TreeSet<Integer>();
+ 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<Integer> ll) {
+ if (ll == null || ll.size() == 0)
+ return null;
+
+ StringBuilder sb = new StringBuilder(2000);
+ Iterator<Integer> 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<String> listStr(String s) {
+ if (s == null || s.length() == 0)
+ return null;
+ String[] ss = s.split(",");
+ return Arrays.asList(ss);
+ }
+
+ public static String listStr(Collection<String> ll) {
+ if (ll == null || ll.isEmpty())
+ return null;
+ StringBuilder ss = new StringBuilder(1000);
+ Iterator<String> 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 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ============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=========================================================
+ -->
+
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+ <!-- JDBC setup -->
+
+ <bean id="rm.dataSource" class="org.openecomp.sdnc.util.db.DataSourceWrap">
+ <property name="dataSource" ref="dblib.dataSource" />
+ </bean>
+
+ <bean id="lock.dataSource" class="org.openecomp.sdnc.util.db.CachedDataSourceWrap">
+ <property name="dataSource" ref="rm.dataSource" />
+ </bean>
+
+ <bean id="rm.jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
+ <property name="dataSource" ref="rm.dataSource" />
+ </bean>
+
+ <bean id="lock.jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
+ <property name="dataSource" ref="lock.dataSource" />
+ </bean>
+
+ <!-- Utils Configuration -->
+
+ <bean id="speedUtil" class="org.openecomp.sdnc.util.speed.SpeedUtil">
+ <property name="unitFactor" value="1000" />
+ </bean>
+
+ <!-- Resource Lock Configuration -->
+
+ <bean id="resourceLockDao" class="org.openecomp.sdnc.lock.dao.ResourceLockDaoImpl">
+ <property name="jdbcTemplate" ref="lock.jdbcTemplate" />
+ </bean>
+
+ <bean id="lockHelper" class="org.openecomp.sdnc.lock.comp.LockHelperImpl">
+ <property name="resourceLockDao" ref="resourceLockDao" />
+ <property name="retryCount" value="10" />
+ <property name="lockWait" value="5" /> <!-- Seconds -->
+ </bean>
+
+ <!-- RM Configuration -->
+
+ <bean id="resourceJdbcDao" class="org.openecomp.sdnc.rm.dao.jdbc.ResourceJdbcDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <bean id="allocationItemJdbcDao" class="org.openecomp.sdnc.rm.dao.jdbc.AllocationItemJdbcDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <bean id="resourceLoadJdbcDao" class="org.openecomp.sdnc.rm.dao.jdbc.ResourceLoadJdbcDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <bean id="resourceDao" class="org.openecomp.sdnc.rm.dao.jdbc.ResourceDaoImpl">
+ <property name="resourceJdbcDao" ref="resourceJdbcDao" />
+ <property name="allocationItemJdbcDao" ref="allocationItemJdbcDao" />
+ <property name="resourceLoadJdbcDao" ref="resourceLoadJdbcDao" />
+ </bean>
+
+ <bean id="resourceManager" class="org.openecomp.sdnc.rm.comp.ResourceManagerImpl">
+ <property name="lockHelper" ref="lockHelper" />
+ <property name="resourceDao" ref="resourceDao" />
+ <property name="applicationId" value="SDNC" />
+ <property name="lockTimeout" value="600" /> <!-- Seconds -->
+ </bean>
+
+ <!-- Equipment DAO Configuration -->
+
+ <bean id="serverDao" class="org.openecomp.sdnc.ra.equip.dao.ServerDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <bean id="vpePortDao" class="org.openecomp.sdnc.ra.equip.dao.VpePortDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <bean id="vplspePortDao" class="org.openecomp.sdnc.ra.equip.dao.VplspePortDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <!-- Rule DAO Configuration -->
+
+ <bean id="parameterDao" class="org.openecomp.sdnc.ra.rule.dao.ParameterDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <bean id="maxPortSpeedDao" class="org.openecomp.sdnc.ra.rule.dao.MaxPortSpeedDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ <property name="speedUtil" ref="speedUtil" />
+ </bean>
+
+ <bean id="maxServerSpeedDao" class="org.openecomp.sdnc.ra.rule.dao.MaxServerSpeedDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ <property name="speedUtil" ref="speedUtil" />
+ </bean>
+
+ <bean id="resourceRuleDao" class="org.openecomp.sdnc.ra.rule.dao.ResourceRuleDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <bean id="rangeRuleDao" class="org.openecomp.sdnc.ra.rule.dao.RangeRuleDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <bean id="vpeLockDao" class="org.openecomp.sdnc.ra.rule.dao.VpeLockDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <!-- Service DAO Configuration -->
+
+ <bean id="serviceResourceDao" class="org.openecomp.sdnc.ra.service.dao.ServiceResourceDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <!-- ResourceAllocator Configuration -->
+
+ <bean id="allocationRequestBuilder"
+ class="org.openecomp.sdnc.ra.rule.comp.AllocationRequestBuilderImpl">
+ <property name="resourceRuleDao" ref="resourceRuleDao" />
+ <property name="rangeRuleDao" ref="rangeRuleDao" />
+ </bean>
+
+ <bean id="resourceAllocator" class="org.openecomp.sdnc.ra.ResourceAllocator">
+ <property name="speedUtil" ref="speedUtil" />
+ <property name="parameterDao" ref="parameterDao" />
+ <property name="serverDao" ref="serverDao" />
+ <property name="vpePortDao" ref="vpePortDao" />
+ <property name="vplspePortDao" ref="vplspePortDao" />
+ <property name="maxPortSpeedDao" ref="maxPortSpeedDao" />
+ <property name="maxServerSpeedDao" ref="maxServerSpeedDao" />
+ <property name="serviceResourceDao" ref="serviceResourceDao" />
+ <property name="allocationRequestBuilder" ref="allocationRequestBuilder" />
+ <property name="resourceManager" ref="resourceManager" />
+ <property name="endPointAllocator" ref="endPointAllocator" />
+ </bean>
+
+ <!-- EndPointAllocator Configuration -->
+
+ <bean id="endPointAllocator" class="org.openecomp.sdnc.ra.comp.EndPointAllocatorImpl">
+ <property name="resourceManager" ref="resourceManager" />
+ <property name="endPointAllocationDefinitionMap">
+ <map>
+ <entry key="L3AVPN-PORT">
+ <list>
+ <bean class="org.openecomp.sdnc.ra.comp.EndPointAllocationDefinition">
+ <property name="serviceModel" value="L3AVPN-PORT" />
+ <property name="endPointPosition" value="VPE-Cust" />
+ <property name="equipmentReader" ref="vpePortReader" />
+ <property name="equipmentCheckList">
+ <list>
+ <ref bean="provStatusCheck" />
+ <ref bean="excludeVpeCheck" />
+ <ref bean="anyVrfPresentCheck" />
+ </list>
+ </property>
+ <property name="preferenceRuleList">
+ <list>
+ <ref bean="affinityLinkPref" />
+ </list>
+ </property>
+ <property name="allocationRuleList">
+ <list>
+ <ref bean="dbAllocationRule" />
+ <ref bean="affinityAllocationRule" />
+ </list>
+ </property>
+ </bean>
+ </list>
+ </entry>
+ <entry key="L3AVPN-EVC">
+ <list>
+ <bean class="org.openecomp.sdnc.ra.comp.EndPointAllocationDefinition">
+ <property name="serviceModel" value="L3AVPN-EVC" />
+ <property name="endPointPosition" value="VPE-Cust" />
+ <property name="equipmentReader" ref="vpePortReader" />
+ <property name="equipmentCheckList">
+ <list>
+ <ref bean="vlanSpeedCheck" />
+ <ref bean="provStatusCheck" />
+ <ref bean="excludeVpeCheck" />
+ <ref bean="vpeLockCheck" />
+ <ref bean="anyVrfPresentCheck" />
+ <ref bean="oneMVrfCheck" />
+ <ref bean="hubWithRgCheck" />
+ </list>
+ </property>
+ <property name="preferenceRuleList">
+ <list>
+ <ref bean="affinityLinkPref" />
+ </list>
+ </property>
+ <property name="allocationRuleList">
+ <list>
+ <ref bean="dbAllocationRule" />
+ <ref bean="vrfAllocationRule" />
+ <ref bean="servingSiteAllocationRule" />
+ <ref bean="affinityAllocationRule" />
+ </list>
+ </property>
+ </bean>
+ </list>
+ </entry>
+ </map>
+ </property>
+ </bean>
+
+ <!-- Equipment Readers Configuration -->
+
+ <bean id="vpePortReader" class="org.openecomp.sdnc.ra.reader.VpePortReader">
+ <property name="vpePortDao" ref="vpePortDao" />
+ </bean>
+
+ <bean id="vnfReader" class="org.openecomp.sdnc.ra.reader.VnfReader">
+ </bean>
+
+ <bean id="aicSiteReader" class="org.openecomp.sdnc.ra.reader.AicSiteReader">
+ </bean>
+
+ <bean id="uplinkCircuitReader" class="org.openecomp.sdnc.ra.reader.UplinkCircuitReader">
+ </bean>
+
+ <!-- Equipment Checks Configuration -->
+
+ <bean id="vlanSpeedCheck" class="org.openecomp.sdnc.ra.check.VlanSpeedCheck">
+ </bean>
+
+ <bean id="provStatusCheck" class="org.openecomp.sdnc.ra.check.ProvStatusCheck">
+ </bean>
+
+ <bean id="excludeVpeCheck" class="org.openecomp.sdnc.ra.check.ExcludeVpeCheck">
+ </bean>
+
+ <bean id="vpeLockCheck" class="org.openecomp.sdnc.ra.check.VpeLockCheck">
+ <property name="vpeLockDao" ref="vpeLockDao" />
+ <property name="resourceManager" ref="resourceManager" />
+ </bean>
+
+ <bean id="anyVrfPresentCheck" class="org.openecomp.sdnc.ra.check.AnyVrfPresentCheck">
+ <property name="resourceManager" ref="resourceManager" />
+ </bean>
+
+ <bean id="oneMVrfCheck" class="org.openecomp.sdnc.ra.check.OneMVrfCheck">
+ <property name="resourceManager" ref="resourceManager" />
+ </bean>
+
+ <bean id="hubWithRgCheck" class="org.openecomp.sdnc.ra.check.HubWithRgCheck">
+ <property name="resourceManager" ref="resourceManager" />
+ </bean>
+
+ <!-- Preference Rule Configuration -->
+
+ <bean id="affinityLinkPref" class="org.openecomp.sdnc.ra.pref.AffinityLinkPref">
+ <property name="resourceManager" ref="resourceManager" />
+ </bean>
+
+ <!-- Resource Allocation Rule Configuration -->
+
+ <bean id="dbAllocationRule" class="org.openecomp.sdnc.ra.alloc.DbAllocationRule">
+ <property name="resourceRuleDao" ref="resourceRuleDao" />
+ <property name="rangeRuleDao" ref="rangeRuleDao" />
+ </bean>
+
+ <bean id="vrfAllocationRule" class="org.openecomp.sdnc.ra.alloc.VrfAllocationRule">
+ </bean>
+
+ <bean id="servingSiteAllocationRule" class="org.openecomp.sdnc.ra.alloc.ServingSiteAllocationRule">
+ </bean>
+
+ <bean id="affinityAllocationRule" class="org.openecomp.sdnc.ra.alloc.AffinityAllocationRule">
+ </bean>
+
+</beans>
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============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=========================================================
+ -->
+
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+ xsi:schemaLocation="http://www.springframework.org/schema/osgi
+ http://www.springframework.org/schema/osgi/spring-osgi.xsd
+ http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+ <reference id="dblib.dataSource">
+ <interfaces>
+ <beans:value>javax.sql.DataSource</beans:value>
+ <beans:value>org.openecomp.sdnc.sli.resource.dblib.DbLibService</beans:value>
+ </interfaces>
+ </reference>
+
+ <service ref="resourceAllocator" interface="org.openecomp.sdnc.ra.ResourceAllocator" />
+
+</beans:beans>
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 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ============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=========================================================
+ -->
+
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
+ http://www.springframework.org/schema/jdbc
+ http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context-3.1.xsd
+ ">
+
+ <context:annotation-config />
+
+ <!-- JDBC setup -->
+
+ <bean id="test.dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" lazy-init="false">
+ <property name="driverClassName" value="org.h2.Driver" />
+ <property name="url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;MODE=MySQL" />
+ </bean>
+
+ <jdbc:initialize-database data-source="test.dataSource">
+ <jdbc:script location="sql/schema.sql" />
+ <jdbc:script location="sql/data.sql" />
+ </jdbc:initialize-database>
+
+ <bean id="rm.jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
+ <property name="dataSource" ref="test.dataSource" />
+ </bean>
+
+ <bean id="testDb" class="jtest.util.org.openecomp.sdnc.ra.TestDb">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <bean id="dataSetup" class="jtest.org.openecomp.sdnc.ra.DataSetup">
+ <property name="testDb" ref="testDb" />
+ </bean>
+
+ <!-- Utils Configuration -->
+
+ <bean id="speedUtil" class="org.openecomp.sdnc.util.speed.SpeedUtil">
+ <property name="unitFactor" value="1000" />
+ </bean>
+
+ <!-- Resource Lock Configuration -->
+
+ <bean id="resourceLockDao" class="org.openecomp.sdnc.lock.dao.ResourceLockDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ <property name="testing" value="true" />
+ </bean>
+
+ <bean id="lockHelper" class="org.openecomp.sdnc.lock.comp.LockHelperImpl">
+ <property name="resourceLockDao" ref="resourceLockDao" />
+ <property name="retryCount" value="10" />
+ <property name="lockWait" value="5" /> <!-- Seconds -->
+ </bean>
+
+ <!-- RM Configuration -->
+
+ <bean id="resourceJdbcDao" class="org.openecomp.sdnc.rm.dao.jdbc.ResourceJdbcDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <bean id="allocationItemJdbcDao" class="org.openecomp.sdnc.rm.dao.jdbc.AllocationItemJdbcDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <bean id="resourceLoadJdbcDao" class="org.openecomp.sdnc.rm.dao.jdbc.ResourceLoadJdbcDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <bean id="resourceDao" class="org.openecomp.sdnc.rm.dao.jdbc.ResourceDaoImpl">
+ <property name="resourceJdbcDao" ref="resourceJdbcDao" />
+ <property name="allocationItemJdbcDao" ref="allocationItemJdbcDao" />
+ <property name="resourceLoadJdbcDao" ref="resourceLoadJdbcDao" />
+ </bean>
+
+ <bean id="resourceManager" class="org.openecomp.sdnc.rm.comp.ResourceManagerImpl">
+ <property name="lockHelper" ref="lockHelper" />
+ <property name="resourceDao" ref="resourceDao" />
+ <property name="applicationId" value="SDNC" />
+ <property name="lockTimeout" value="600" /> <!-- Seconds -->
+ </bean>
+
+ <!-- Equipment DAO Configuration -->
+
+ <bean id="serverDao" class="org.openecomp.sdnc.ra.equip.dao.ServerDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <bean id="vpePortDao" class="org.openecomp.sdnc.ra.equip.dao.VpePortDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <bean id="vplspePortDao" class="org.openecomp.sdnc.ra.equip.dao.VplspePortDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <!-- Rule DAO Configuration -->
+
+ <bean id="maxPortSpeedDao" class="org.openecomp.sdnc.ra.rule.dao.MaxPortSpeedDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ <property name="speedUtil" ref="speedUtil" />
+ </bean>
+
+ <bean id="maxServerSpeedDao" class="org.openecomp.sdnc.ra.rule.dao.MaxServerSpeedDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ <property name="speedUtil" ref="speedUtil" />
+ </bean>
+
+ <bean id="resourceRuleDao" class="org.openecomp.sdnc.ra.rule.dao.ResourceRuleDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <bean id="rangeRuleDao" class="org.openecomp.sdnc.ra.rule.dao.RangeRuleDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <bean id="vpeLockDao" class="org.openecomp.sdnc.ra.rule.dao.VpeLockDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <bean id="parameterDao" class="org.openecomp.sdnc.ra.rule.dao.ParameterDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <!-- Service DAO Configuration -->
+
+ <bean id="serviceResourceDao" class="org.openecomp.sdnc.ra.service.dao.ServiceResourceDaoImpl">
+ <property name="jdbcTemplate" ref="rm.jdbcTemplate" />
+ </bean>
+
+ <!-- ResourceAllocator Configuration -->
+
+ <bean id="allocationRequestBuilder" class="org.openecomp.sdnc.ra.rule.comp.AllocationRequestBuilderImpl">
+ <property name="resourceRuleDao" ref="resourceRuleDao" />
+ <property name="rangeRuleDao" ref="rangeRuleDao" />
+ </bean>
+
+ <bean id="resourceAllocator" class="org.openecomp.sdnc.ra.ResourceAllocator">
+ <property name="speedUtil" ref="speedUtil" />
+ <property name="parameterDao" ref="parameterDao" />
+ <property name="serverDao" ref="serverDao" />
+ <property name="vpePortDao" ref="vpePortDao" />
+ <property name="vplspePortDao" ref="vplspePortDao" />
+ <property name="maxPortSpeedDao" ref="maxPortSpeedDao" />
+ <property name="maxServerSpeedDao" ref="maxServerSpeedDao" />
+ <property name="serviceResourceDao" ref="serviceResourceDao" />
+ <property name="allocationRequestBuilder" ref="allocationRequestBuilder" />
+ <property name="resourceManager" ref="resourceManager" />
+ <property name="endPointAllocator" ref="endPointAllocator" />
+ </bean>
+
+ <!-- EndPointAllocator Configuration -->
+
+ <bean id="endPointAllocator" class="org.openecomp.sdnc.ra.comp.EndPointAllocatorImpl">
+ <property name="resourceManager" ref="resourceManager" />
+ <property name="endPointAllocationDefinitionMap">
+ <map>
+ <entry key="L3AVPN-PORT">
+ <list>
+ <bean class="org.openecomp.sdnc.ra.comp.EndPointAllocationDefinition">
+ <property name="serviceModel" value="L3AVPN-PORT" />
+ <property name="endPointPosition" value="VPE-Cust" />
+ <property name="equipmentReader" ref="vpePortReader" />
+ <property name="equipmentCheckList">
+ <list>
+ <ref bean="provStatusCheck" />
+ <ref bean="excludeVpeCheck" />
+ <ref bean="anyVrfPresentCheck" />
+ </list>
+ </property>
+ <property name="preferenceRuleList">
+ <list>
+ <ref bean="affinityLinkPref" />
+ </list>
+ </property>
+ <property name="allocationRuleList">
+ <list>
+ <ref bean="dbAllocationRule" />
+ <ref bean="affinityAllocationRule" />
+ </list>
+ </property>
+ </bean>
+ </list>
+ </entry>
+ <entry key="L3AVPN-EVC">
+ <list>
+ <bean class="org.openecomp.sdnc.ra.comp.EndPointAllocationDefinition">
+ <property name="serviceModel" value="L3AVPN-EVC" />
+ <property name="endPointPosition" value="VPE-Cust" />
+ <property name="equipmentReader" ref="vpePortReader" />
+ <property name="equipmentCheckList">
+ <list>
+ <ref bean="provStatusCheck" />
+ <ref bean="excludeVpeCheck" />
+ <ref bean="vpeLockCheck" />
+ <ref bean="anyVrfPresentCheck" />
+ <ref bean="oneMVrfCheck" />
+ <ref bean="hubWithRgCheck" />
+ </list>
+ </property>
+ <property name="preferenceRuleList">
+ <list>
+ <ref bean="affinityLinkPref" />
+ </list>
+ </property>
+ <property name="allocationRuleList">
+ <list>
+ <ref bean="dbAllocationRule" />
+ <ref bean="vrfAllocationRule" />
+ <ref bean="servingSiteAllocationRule" />
+ <ref bean="affinityAllocationRule" />
+ </list>
+ </property>
+ </bean>
+ </list>
+ </entry>
+ </map>
+ </property>
+ </bean>
+
+ <!-- Equipment Readers Configuration -->
+
+ <bean id="vpePortReader" class="org.openecomp.sdnc.ra.reader.VpePortReader">
+ <property name="vpePortDao" ref="vpePortDao" />
+ </bean>
+
+ <!-- Equipment Checks Configuration -->
+
+ <bean id="provStatusCheck" class="org.openecomp.sdnc.ra.check.ProvStatusCheck">
+ </bean>
+
+ <bean id="excludeVpeCheck" class="org.openecomp.sdnc.ra.check.ExcludeVpeCheck">
+ </bean>
+
+ <bean id="vpeLockCheck" class="org.openecomp.sdnc.ra.check.VpeLockCheck">
+ <property name="vpeLockDao" ref="vpeLockDao" />
+ <property name="resourceManager" ref="resourceManager" />
+ </bean>
+
+ <bean id="anyVrfPresentCheck" class="org.openecomp.sdnc.ra.check.AnyVrfPresentCheck">
+ <property name="resourceManager" ref="resourceManager" />
+ </bean>
+
+ <bean id="oneMVrfCheck" class="org.openecomp.sdnc.ra.check.OneMVrfCheck">
+ <property name="resourceManager" ref="resourceManager" />
+ </bean>
+
+ <bean id="hubWithRgCheck" class="org.openecomp.sdnc.ra.check.HubWithRgCheck">
+ <property name="resourceManager" ref="resourceManager" />
+ </bean>
+
+ <!-- Preference Rule Configuration -->
+
+ <bean id="affinityLinkPref" class="org.openecomp.sdnc.ra.pref.AffinityLinkPref">
+ <property name="resourceManager" ref="resourceManager" />
+ </bean>
+
+ <!-- Resource Allocation Rule Configuration -->
+
+ <bean id="dbAllocationRule" class="org.openecomp.sdnc.ra.alloc.DbAllocationRule">
+ <property name="resourceRuleDao" ref="resourceRuleDao" />
+ <property name="rangeRuleDao" ref="rangeRuleDao" />
+ </bean>
+
+ <bean id="vrfAllocationRule" class="org.openecomp.sdnc.ra.alloc.VrfAllocationRule">
+ </bean>
+
+ <bean id="servingSiteAllocationRule" class="org.openecomp.sdnc.ra.alloc.ServingSiteAllocationRule">
+ </bean>
+
+ <bean id="affinityAllocationRule" class="org.openecomp.sdnc.ra.alloc.AffinityAllocationRule">
+ </bean>
+
+</beans>