aboutsummaryrefslogtreecommitdiffstats
path: root/plans
diff options
context:
space:
mode:
Diffstat (limited to 'plans')
-rwxr-xr-x[-rw-r--r--]plans/so/integration-etsi-testing/config/distribution-test-zip/zipped_sdc_csar.tar.gzbin130213 -> 141700 bytes
-rw-r--r--plans/so/integration-etsi-testing/config/env3
-rw-r--r--plans/so/integration-etsi-testing/config/override-files/api-handler-infra/onapheat/override.yaml2
-rw-r--r--plans/so/integration-etsi-testing/config/override-files/vnfm-simulator/onapheat/override.yaml20
-rwxr-xr-xplans/so/integration-etsi-testing/config/wait-for-container.sh2
-rw-r--r--plans/so/integration-etsi-testing/docker-compose.local.yml5
-rw-r--r--plans/so/integration-etsi-testing/docker-compose.yml29
-rwxr-xr-xplans/so/integration-etsi-testing/setup.sh15
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/aai-simulator/pom.xml2
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/aai-simulator/src/main/java/org/onap/so/aaisimulator/controller/BusinessController.java40
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/aai-simulator/src/main/java/org/onap/so/aaisimulator/service/providers/CustomerCacheServiceProvider.java10
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/aai-simulator/src/main/java/org/onap/so/aaisimulator/service/providers/CustomerCacheServiceProviderImpl.java48
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/aai-simulator/src/test/java/org/onap/so/aaisimulator/controller/BusinessControllerTest.java35
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/package/docker/src/main/docker/docker-files/Dockerfile.so-simulator-base-image5
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/package/docker/src/main/docker/docker-files/Dockerfile.workaround-job-container5
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/sdc-simulator/pom.xml5
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/configration/WebSecurityConfigImpl.java31
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/controller/CatalogController.java6
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/models/ResourceArtifact.java245
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/providers/ResourceProvider.java6
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/providers/ResourceProviderImpl.java98
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/utils/Constants.java6
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/resources/application.yaml13
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/resources/csar/73522444-e8e9-49c1-be29-d355800aa349.csarbin0 -> 117247 bytes
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/resources/csar/ba1c0c0e-9fb8-4b83-97bb-5e9af1e73393.csarbin0 -> 116913 bytes
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/test/java/org/onap/so/sdcsimulator/controller/CatalogControllerTest.java25
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/test/java/org/onap/so/sdcsimulator/providers/ResourceProviderImplTest.java22
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/vnfm-simulator/vnfm-service/src/main/java/org/onap/so/svnfm/simulator/model/Vnfds.java36
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/vnfm-simulator/vnfm-service/src/main/java/org/onap/so/svnfm/simulator/services/InstantiateOperationProgressor.java8
-rw-r--r--plans/so/integration-etsi-testing/so-simulators/vnfm-simulator/vnfm-service/src/main/java/org/onap/so/svnfm/simulator/services/TerminateOperationProgressor.java12
-rwxr-xr-xplans/usecases-config-over-netconf/config-over-netconf/cds/cds_setup.sh55
-rwxr-xr-xplans/usecases-config-over-netconf/config-over-netconf/cds/docker-compose.yaml18
-rwxr-xr-xplans/usecases-config-over-netconf/config-over-netconf/cds/resources/application.properties97
-rwxr-xr-xplans/usecases-config-over-netconf/config-over-netconf/cds/resources/error-messages_en.properties77
-rwxr-xr-xplans/usecases-config-over-netconf/config-over-netconf/cds/resources/importCerAndStartService.sh8
-rwxr-xr-xplans/usecases-config-over-netconf/config-over-netconf/netconf-pnp-simulator/docker-compose.yml12
-rw-r--r--plans/usecases-config-over-netconf/config-over-netconf/netconf-pnp-simulator/netconf-config/data.json10
-rw-r--r--plans/usecases-config-over-netconf/config-over-netconf/netconf-pnp-simulator/netconf-config/model.yang29
-rwxr-xr-xplans/usecases-config-over-netconf/config-over-netconf/netconf-pnp-simulator/netconf-config/subscriber.py136
-rw-r--r--plans/usecases-config-over-netconf/config-over-netconf/setup.sh131
-rwxr-xr-xplans/usecases-config-over-netconf/config-over-netconf/teardown.sh20
-rw-r--r--plans/usecases-config-over-netconf/config-over-netconf/test.properties14
42 files changed, 1086 insertions, 255 deletions
diff --git a/plans/so/integration-etsi-testing/config/distribution-test-zip/zipped_sdc_csar.tar.gz b/plans/so/integration-etsi-testing/config/distribution-test-zip/zipped_sdc_csar.tar.gz
index d0e346f3..209dfca4 100644..100755
--- a/plans/so/integration-etsi-testing/config/distribution-test-zip/zipped_sdc_csar.tar.gz
+++ b/plans/so/integration-etsi-testing/config/distribution-test-zip/zipped_sdc_csar.tar.gz
Binary files differ
diff --git a/plans/so/integration-etsi-testing/config/env b/plans/so/integration-etsi-testing/config/env
index 647f53a6..c0d8210a 100644
--- a/plans/so/integration-etsi-testing/config/env
+++ b/plans/so/integration-etsi-testing/config/env
@@ -1,6 +1,7 @@
NEXUS_DOCKER_REPO_MSO=nexus3.onap.org:10001
DOCKER_ENVIRONMENT=remote
-TAG=1.6.0
+TAG=1.8.0-STAGING-latest
TIME_OUT_DEFAULT_VALUE_SEC=1200
PROJECT_NAME=etsiintegrationtesting
DEFAULT_NETWORK_NAME=etsiintegrationtesting_default
+ETSI_CATALOG_IMAGE_VERSION=1.0.9
diff --git a/plans/so/integration-etsi-testing/config/override-files/api-handler-infra/onapheat/override.yaml b/plans/so/integration-etsi-testing/config/override-files/api-handler-infra/onapheat/override.yaml
index bdf5c4de..327e7987 100644
--- a/plans/so/integration-etsi-testing/config/override-files/api-handler-infra/onapheat/override.yaml
+++ b/plans/so/integration-etsi-testing/config/override-files/api-handler-infra/onapheat/override.yaml
@@ -131,3 +131,5 @@ org:
adapters:
network:
encryptionKey: 07a7159d3bf51a0e53be7a8f89699be7
+aai:
+ auth: 221187EFA3AD4E33600DE0488F287099934CE65C3D0697BCECC00BB58E784E07CD74A24581DC31DBC086FF63DF116378776E9BE3D1325885
diff --git a/plans/so/integration-etsi-testing/config/override-files/vnfm-simulator/onapheat/override.yaml b/plans/so/integration-etsi-testing/config/override-files/vnfm-simulator/onapheat/override.yaml
index 05cb1e56..b57d0e85 100644
--- a/plans/so/integration-etsi-testing/config/override-files/vnfm-simulator/onapheat/override.yaml
+++ b/plans/so/integration-etsi-testing/config/override-files/vnfm-simulator/onapheat/override.yaml
@@ -54,3 +54,23 @@ vnfds:
resourceTemplateId: vnfd2_vnfc4
vduId: vnfd2_vduForVnfc4
type: COMPUTE
+ - vnfdid: b1bb0ce7-2222-4fa7-95ed-4840d70a1177
+ vnfclist:
+ - vnfcid: VNFC5
+ resourceTemplateId: vnfd3_vnfc4
+ vduId: vnfd3_vduForVnfc4
+ type: COMPUTE
+ - vnfcid: VNFC6
+ resourceTemplateId: vnfd3_vnfc5
+ vduId: vnfd3_vduForVnfc5
+ type: COMPUTE
+ - vnfdid: 0c960b3a-d88f-11ea-87d0-0242ac130003
+ vnfclist:
+ - vnfcid: VNFC7
+ resourceTemplateId: vnfd4_vnfc5
+ vduId: vnfd4_vduForVnfc5
+ type: COMPUTE
+ - vnfcid: VNFC8
+ resourceTemplateId: vnfd4_vnfc6
+ vduId: vnfd4_vduForVnfc6
+ type: COMPUTE
diff --git a/plans/so/integration-etsi-testing/config/wait-for-container.sh b/plans/so/integration-etsi-testing/config/wait-for-container.sh
index 35ee2641..11e32bce 100755
--- a/plans/so/integration-etsi-testing/config/wait-for-container.sh
+++ b/plans/so/integration-etsi-testing/config/wait-for-container.sh
@@ -121,6 +121,7 @@ process_arguments()
result=$(docker inspect --format '{{.State.Running}}' $CONTAINER_NAME)
if [ $result != "true" ] ; then
+ docker logs $CONTAINER_NAME
echo "$SCRIPT_NAME $(current_timestamp) ERROR: $CONTAINER_NAME container is not running"
exit 1
fi
@@ -142,6 +143,7 @@ process_arguments()
$WAIT_FOR_SCRIPT -t "$TIME_OUT" -h "$HOST_IP" -p "$PORT"
if [ $? -ne 0 ]; then
+ docker logs $CONTAINER_NAME
echo "$SCRIPT_NAME $(current_timestamp) ERROR: wait-for.sh failed ..."
exit 1
fi
diff --git a/plans/so/integration-etsi-testing/docker-compose.local.yml b/plans/so/integration-etsi-testing/docker-compose.local.yml
index e11b8006..26b45a3d 100644
--- a/plans/so/integration-etsi-testing/docker-compose.local.yml
+++ b/plans/so/integration-etsi-testing/docker-compose.local.yml
@@ -28,6 +28,5 @@ services:
so-vnfm-adapter:
image: onap/so/vnfm-adapter:${TAG}
################################################################################
- ve-vnfm-adapter:
- image: onap/so/ve-vnfm-adapter:${TAG}
-################################################################################
+ modeling-etsicatalog:
+ image: ${NEXUS_DOCKER_REPO_MSO}/onap/modeling/etsicatalog:${ETSI_CATALOG_IMAGE_VERSION}
diff --git a/plans/so/integration-etsi-testing/docker-compose.yml b/plans/so/integration-etsi-testing/docker-compose.yml
index 2ee5026a..f1853e0e 100644
--- a/plans/so/integration-etsi-testing/docker-compose.yml
+++ b/plans/so/integration-etsi-testing/docker-compose.yml
@@ -6,10 +6,14 @@ services:
ports:
- "3306:3306"
volumes:
+ - /var/lib/mysql
- ${TEST_LAB_DIR}/volumes/mariadb/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
- ${TEST_LAB_DIR}/volumes/mariadb/conf.d:/etc/mysql/conf.d
environment:
- MYSQL_ROOT_PASSWORD=password
+ - MYSQL_USER=etsicatalog
+ - MYSQL_PASSWORD=etsicatalog
+ - MYSQL_DATABASE=etsicatalog
hostname:
mariadb.so.testlab.onap.org
logging:
@@ -345,27 +349,24 @@ services:
command:
- "/config/populate-aai-simulator.sh"
################################################################################
- ve-vnfm-adapter:
- image: ${NEXUS_DOCKER_REPO_MSO}/onap/so/ve-vnfm-adapter:${TAG}
+ modeling-etsicatalog:
+ image: ${NEXUS_DOCKER_REPO_MSO}/onap/modeling/etsicatalog:${ETSI_CATALOG_IMAGE_VERSION}
ports:
- - "9098:9098"
+ - "8806:8806"
volumes:
- - ${CONFIG_DIR_PATH}/override-files/ve-vnfm-adapter/onapheat:/app/config
- - ${CONFIG_DIR_PATH}/certificates/truststore/root-ca.crt:/app/ca-certificates/root-ca.crt
+ - /var/lib/mysql
+ - ${CONFIG_DIR_PATH}/wait-for.sh:/service/wait-for.sh
environment:
- - APP=ve-vnfm-adapter
- - JVM_ARGS=-Xms64m -Xmx512m
- - DB_HOST=mariadb
+ - DB_IP=mariadb
+ - SDC_ADDR=http://sdc-simulator:9991
hostname:
- ve-vnfm-adapter
+ modeling-etsicatalog
depends_on:
- - request-db-adapter
- - aai-simulator
+ - mariadb
+ - sdc-simulator
logging:
driver: "json-file"
options:
max-size: "30m"
max-file: "5"
- user: root
- entrypoint: /bin/sh -c '/app/wait-for.sh -q -t "300" request-db-adapter:8083 -- "/app/start-app.sh"'
-################################################################################
+ entrypoint: /bin/sh -c '/service/wait-for.sh -t 300 -h mariadb -p 3306 && /service/modeling/etsicatalog/docker/docker-entrypoint.sh'
diff --git a/plans/so/integration-etsi-testing/setup.sh b/plans/so/integration-etsi-testing/setup.sh
index ce6637c1..ee2fb94f 100755
--- a/plans/so/integration-etsi-testing/setup.sh
+++ b/plans/so/integration-etsi-testing/setup.sh
@@ -49,7 +49,7 @@ echo "Running $SCRIPT_HOME/$SCRIPT_NAME ..."
export $(egrep -v '^#' $ENV_FILE | xargs)
-MANDATORY_VARIABLES_NAMES=( "NEXUS_DOCKER_REPO_MSO" "DOCKER_ENVIRONMENT" "TAG" "TIME_OUT_DEFAULT_VALUE_SEC" "PROJECT_NAME" "DEFAULT_NETWORK_NAME")
+MANDATORY_VARIABLES_NAMES=( "NEXUS_DOCKER_REPO_MSO" "DOCKER_ENVIRONMENT" "TAG" "TIME_OUT_DEFAULT_VALUE_SEC" "PROJECT_NAME" "DEFAULT_NETWORK_NAME", "ETSI_CATALOG_IMAGE_VERSION")
for var in "${MANDATORY_VARIABLES_NAMES[@]}"
do
@@ -153,6 +153,8 @@ fi
echo "Sleeping for 3m"
sleep 3m
+docker ps -a
+
echo "Will execute $WAIT_FOR_WORKAROUND_SCRIPT script"
$WAIT_FOR_WORKAROUND_SCRIPT
@@ -184,6 +186,17 @@ if [ $? -ne 0 ]; then
exit 1
fi
+MODELING_ETSI_CATALOG_CONTAINER_NAME="modeling-etsicatalog"
+echo "Will execute $WAIT_FOR_CONTAINER_SCRIPT to wait for $MODELING_ETSI_CATALOG_CONTAINER_NAME container to start up"
+$WAIT_FOR_CONTAINER_SCRIPT -c "$MODELING_ETSI_CATALOG_CONTAINER_NAME" -t "300" -n "$DEFAULT_NETWORK_NAME"
+
+if [ $? -ne 0 ]; then
+ echo "ERROR: $WAIT_FOR_CONTAINER_SCRIPT failed"
+ echo "Will stop running docker containers . . ."
+ $TEAR_DOWN_SCRIPT
+ exit 1
+fi
+
REPO_IP='127.0.0.1'
ROBOT_VARIABLES="-v REPO_IP:${REPO_IP}"
diff --git a/plans/so/integration-etsi-testing/so-simulators/aai-simulator/pom.xml b/plans/so/integration-etsi-testing/so-simulators/aai-simulator/pom.xml
index 26815ad0..c51cae12 100644
--- a/plans/so/integration-etsi-testing/so-simulators/aai-simulator/pom.xml
+++ b/plans/so/integration-etsi-testing/so-simulators/aai-simulator/pom.xml
@@ -8,7 +8,7 @@
</parent>
<artifactId>aai-simulator</artifactId>
<properties>
- <version.aai.schema>1.0.0</version.aai.schema>
+ <version.aai.schema>1.8.1</version.aai.schema>
</properties>
<dependencies>
<dependency>
diff --git a/plans/so/integration-etsi-testing/so-simulators/aai-simulator/src/main/java/org/onap/so/aaisimulator/controller/BusinessController.java b/plans/so/integration-etsi-testing/so-simulators/aai-simulator/src/main/java/org/onap/so/aaisimulator/controller/BusinessController.java
index 4a0ed1b9..1221beae 100644
--- a/plans/so/integration-etsi-testing/so-simulators/aai-simulator/src/main/java/org/onap/so/aaisimulator/controller/BusinessController.java
+++ b/plans/so/integration-etsi-testing/so-simulators/aai-simulator/src/main/java/org/onap/so/aaisimulator/controller/BusinessController.java
@@ -23,12 +23,12 @@ import static org.onap.so.aaisimulator.utils.Constants.BI_DIRECTIONAL_RELATIONSH
import static org.onap.so.aaisimulator.utils.Constants.CUSTOMER_TYPE;
import static org.onap.so.aaisimulator.utils.Constants.CUSTOMER_URL;
import static org.onap.so.aaisimulator.utils.Constants.GENERIC_VNF;
-import static org.onap.so.aaisimulator.utils.Constants.GENERIC_VNF_VNF_ID;
import static org.onap.so.aaisimulator.utils.Constants.SERVICE_RESOURCE_TYPE;
import static org.onap.so.aaisimulator.utils.Constants.SERVICE_SUBSCRIPTION;
import static org.onap.so.aaisimulator.utils.Constants.X_HTTP_METHOD_OVERRIDE;
import static org.onap.so.aaisimulator.utils.RequestErrorResponseUtils.getRequestErrorResponseEntity;
import static org.onap.so.aaisimulator.utils.RequestErrorResponseUtils.getResourceVersion;
+import java.util.List;
import java.util.Optional;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.MediaType;
@@ -36,7 +36,6 @@ import org.onap.aai.domain.yang.Customer;
import org.onap.aai.domain.yang.GenericVnf;
import org.onap.aai.domain.yang.GenericVnfs;
import org.onap.aai.domain.yang.Relationship;
-import org.onap.aai.domain.yang.RelationshipData;
import org.onap.aai.domain.yang.ServiceInstance;
import org.onap.aai.domain.yang.ServiceInstances;
import org.onap.aai.domain.yang.ServiceSubscription;
@@ -263,33 +262,32 @@ public class BusinessController {
public ResponseEntity<?> getRelatedToGenericVnf(@PathVariable("global-customer-id") final String globalCustomerId,
@PathVariable("service-type") final String serviceType,
@PathVariable(name = "service-instance-id") final String serviceInstanceId,
- @RequestParam(name = "vnf-name", required = true) final String vnfName, final HttpServletRequest request) {
+ @RequestParam(name = "vnf-name", required = false) final String vnfName, final HttpServletRequest request) {
LOGGER.info(
"Will retrieve generic vnf related to information for 'global customer id': {}, 'service type': {} and 'service instance id: '{} with vnfname: {}...",
globalCustomerId, serviceType, serviceInstanceId, vnfName);
- final Optional<Relationship> optional =
- cacheServiceProvider.getRelationship(globalCustomerId, serviceType, serviceInstanceId, vnfName);
+ final List<String> relatedToVnfIds =
+ getRelatedToVnfIds(globalCustomerId, serviceType, serviceInstanceId, vnfName);
- if (optional.isPresent()) {
-
- final Relationship relationship = optional.get();
- final Optional<RelationshipData> relationshipDataOptional = relationship.getRelationshipData().stream()
- .filter(existing -> GENERIC_VNF_VNF_ID.equals(existing.getRelationshipKey())).findFirst();
- if (relationshipDataOptional.isPresent()) {
- final RelationshipData relationshipData = relationshipDataOptional.get();
- final String vnfId = relationshipData.getRelationshipValue();
+ if (!relatedToVnfIds.isEmpty()) {
+ final GenericVnfs genericVnfs = new GenericVnfs();
+ relatedToVnfIds.stream().forEach(vnfId -> {
final Optional<GenericVnf> genericVnfOptional = genericVnfCacheServiceProvider.getGenericVnf(vnfId);
if (genericVnfOptional.isPresent()) {
- final GenericVnfs genericVnfs = new GenericVnfs();
- genericVnfs.getGenericVnf().add(genericVnfOptional.get());
- LOGGER.info("found service instance {} in cache", relationship);
- return ResponseEntity.ok(genericVnfs);
+ final GenericVnf genericVnf = genericVnfOptional.get();
+ LOGGER.info("found related-to generic-vnf {} in cache", genericVnf);
+ genericVnfs.getGenericVnf().add(genericVnf);
}
+ });
+ if (!genericVnfs.getGenericVnf().isEmpty()) {
+ LOGGER.info("Found {} related generic-vnfs", genericVnfs.getGenericVnf().size());
+ return ResponseEntity.ok(genericVnfs);
}
}
+
LOGGER.error(
"Couldn't find generic vnf related to information for 'global customer id': {}, 'service type': {} and 'service instance id: '{} with vnfname: {}...",
globalCustomerId, serviceType, serviceInstanceId, vnfName);
@@ -353,4 +351,12 @@ public class BusinessController {
return getRequestErrorResponseEntity(request);
}
+
+ private List<String> getRelatedToVnfIds(final String globalCustomerId, final String serviceType,
+ final String serviceInstanceId, final String vnfName) {
+ if (vnfName != null) {
+ return cacheServiceProvider.getRelatedToVnfIds(globalCustomerId, serviceType, serviceInstanceId, vnfName);
+ }
+ return cacheServiceProvider.getRelatedToVnfIds(globalCustomerId, serviceType, serviceInstanceId);
+ }
}
diff --git a/plans/so/integration-etsi-testing/so-simulators/aai-simulator/src/main/java/org/onap/so/aaisimulator/service/providers/CustomerCacheServiceProvider.java b/plans/so/integration-etsi-testing/so-simulators/aai-simulator/src/main/java/org/onap/so/aaisimulator/service/providers/CustomerCacheServiceProvider.java
index 7000fb3f..af3595a0 100644
--- a/plans/so/integration-etsi-testing/so-simulators/aai-simulator/src/main/java/org/onap/so/aaisimulator/service/providers/CustomerCacheServiceProvider.java
+++ b/plans/so/integration-etsi-testing/so-simulators/aai-simulator/src/main/java/org/onap/so/aaisimulator/service/providers/CustomerCacheServiceProvider.java
@@ -19,6 +19,7 @@
*/
package org.onap.so.aaisimulator.service.providers;
+import java.util.List;
import java.util.Optional;
import org.onap.aai.domain.yang.Customer;
import org.onap.aai.domain.yang.Relationship;
@@ -53,13 +54,16 @@ public interface CustomerCacheServiceProvider extends Clearable {
boolean patchServiceInstance(final String globalCustomerId, final String serviceType,
final String serviceInstanceId, final ServiceInstance serviceInstance);
- Optional<Relationship> getRelationship(final String globalCustomerId, final String serviceType,
- final String serviceInstanceId, final String vnfName);
-
Optional<Relationship> addRelationShip(final String globalCustomerId, final String serviceType,
final String serviceInstanceId, final Relationship relationship, final String requestUri);
boolean deleteSericeInstance(final String globalCustomerId, final String serviceType,
final String serviceInstanceId, final String resourceVersion);
+ List<String> getRelatedToVnfIds(final String globalCustomerId, final String serviceType,
+ final String serviceInstanceId, final String vnfName);
+
+ List<String> getRelatedToVnfIds(final String globalCustomerId, final String serviceType,
+ final String serviceInstanceId);
+
}
diff --git a/plans/so/integration-etsi-testing/so-simulators/aai-simulator/src/main/java/org/onap/so/aaisimulator/service/providers/CustomerCacheServiceProviderImpl.java b/plans/so/integration-etsi-testing/so-simulators/aai-simulator/src/main/java/org/onap/so/aaisimulator/service/providers/CustomerCacheServiceProviderImpl.java
index 7193ade1..7285faad 100644
--- a/plans/so/integration-etsi-testing/so-simulators/aai-simulator/src/main/java/org/onap/so/aaisimulator/service/providers/CustomerCacheServiceProviderImpl.java
+++ b/plans/so/integration-etsi-testing/so-simulators/aai-simulator/src/main/java/org/onap/so/aaisimulator/service/providers/CustomerCacheServiceProviderImpl.java
@@ -22,11 +22,14 @@ package org.onap.so.aaisimulator.service.providers;
import static org.onap.so.aaisimulator.utils.CacheName.CUSTOMER_CACHE;
import static org.onap.so.aaisimulator.utils.Constants.CUSTOMER_GLOBAL_CUSTOMER_ID;
import static org.onap.so.aaisimulator.utils.Constants.GENERIC_VNF;
+import static org.onap.so.aaisimulator.utils.Constants.GENERIC_VNF_VNF_ID;
import static org.onap.so.aaisimulator.utils.Constants.GENERIC_VNF_VNF_NAME;
import static org.onap.so.aaisimulator.utils.Constants.SERVICE_INSTANCE_SERVICE_INSTANCE_ID;
import static org.onap.so.aaisimulator.utils.Constants.SERVICE_INSTANCE_SERVICE_INSTANCE_NAME;
import static org.onap.so.aaisimulator.utils.Constants.SERVICE_SUBSCRIPTION_SERVICE_TYPE;
import static org.onap.so.aaisimulator.utils.HttpServiceUtils.getBiDirectionalRelationShipListRelatedLink;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -279,7 +282,7 @@ public class CustomerCacheServiceProviderImpl extends AbstractCacheServiceProvid
}
@Override
- public Optional<Relationship> getRelationship(final String globalCustomerId, final String serviceType,
+ public List<String> getRelatedToVnfIds(final String globalCustomerId, final String serviceType,
final String serviceInstanceId, final String vnfName) {
final Optional<ServiceInstance> optional = getServiceInstance(globalCustomerId, serviceType, serviceInstanceId);
@@ -289,20 +292,53 @@ public class CustomerCacheServiceProviderImpl extends AbstractCacheServiceProvid
final RelationshipList relationshipList = serviceInstance.getRelationshipList();
if (relationshipList != null) {
- final List<Relationship> relationship = relationshipList.getRelationship();
- return relationship.stream().filter(
+ final List<Relationship> relationships = relationshipList.getRelationship().stream().filter(
relationShip -> relationShip.getRelatedToProperty().stream().filter(relatedToProperty -> {
final String propertyKey = relatedToProperty.getPropertyKey();
final String propertyValue = relatedToProperty.getPropertyValue();
return GENERIC_VNF_VNF_NAME.equals(propertyKey) && propertyValue != null
&& propertyValue.equals(vnfName);
- }).findFirst().isPresent()).findFirst();
+ }).findFirst().isPresent()).collect(Collectors.toList());
+ LOGGER.info("Found relationships {} for vnf-name: {}", relationships, vnfName);
+ return getGenericVnfIdsIfPresent(relationships);
}
LOGGER.warn("Relationship list is nulll ...");
}
- LOGGER.error("Unable to RelationShip with property value: {}... ", vnfName);
+ LOGGER.error("Unable to find generic-vnf relationships with property value: {}... ", vnfName);
+ return Collections.emptyList();
+ }
- return Optional.empty();
+ @Override
+ public List<String> getRelatedToVnfIds(final String globalCustomerId, final String serviceType,
+ final String serviceInstanceId) {
+ final Optional<ServiceInstance> optional = getServiceInstance(globalCustomerId, serviceType, serviceInstanceId);
+
+ if (optional.isPresent()) {
+ LOGGER.info("Found service instance ...");
+ final ServiceInstance serviceInstance = optional.get();
+ final RelationshipList relationshipList = serviceInstance.getRelationshipList();
+
+ if (relationshipList != null) {
+ final List<Relationship> relationships = relationshipList.getRelationship();
+ LOGGER.info("Relationships found {}", relationships);
+ return getGenericVnfIdsIfPresent(relationships);
+ }
+ LOGGER.warn("Relationship list is nulll ...");
+ }
+ LOGGER.error("Unable to find generic-vnf relationships ... ");
+ return Collections.emptyList();
+ }
+
+ private List<String> getGenericVnfIdsIfPresent(final List<Relationship> relationships) {
+ final List<String> vnfIdsFound = new ArrayList<>();
+ relationships.stream().forEach(relationship -> {
+ relationship.getRelationshipData().stream()
+ .filter(existing -> GENERIC_VNF_VNF_ID.equals(existing.getRelationshipKey())).findFirst()
+ .ifPresent(consume -> {
+ vnfIdsFound.add(consume.getRelationshipValue());
+ });
+ });
+ return vnfIdsFound;
}
@Override
diff --git a/plans/so/integration-etsi-testing/so-simulators/aai-simulator/src/test/java/org/onap/so/aaisimulator/controller/BusinessControllerTest.java b/plans/so/integration-etsi-testing/so-simulators/aai-simulator/src/test/java/org/onap/so/aaisimulator/controller/BusinessControllerTest.java
index c08c51ec..7da37794 100644
--- a/plans/so/integration-etsi-testing/so-simulators/aai-simulator/src/test/java/org/onap/so/aaisimulator/controller/BusinessControllerTest.java
+++ b/plans/so/integration-etsi-testing/so-simulators/aai-simulator/src/test/java/org/onap/so/aaisimulator/controller/BusinessControllerTest.java
@@ -361,6 +361,41 @@ public class BusinessControllerTest extends AbstractSpringBootTest {
}
@Test
+ public void test_putServiceInstanceRelatedTo_ableToRetrieveAllRelatedGenericVnfsFromCache() throws Exception {
+
+ final String url = getUrl(CUSTOMERS_URL, SERVICE_SUBSCRIPTIONS_URL, SERVICE_INSTANCE_URL);
+
+ invokeCustomerEndPointAndAssertResponse();
+
+ invokeServiceInstanceEndPointAndAssertResponse();
+
+ final String relationShipUrl = getUrl(CUSTOMERS_URL, SERVICE_SUBSCRIPTIONS_URL, SERVICE_INSTANCE_URL,
+ BI_DIRECTIONAL_RELATIONSHIP_LIST_URL);
+
+ final ResponseEntity<Relationship> responseEntity2 = testRestTemplateService.invokeHttpPut(relationShipUrl,
+ TestUtils.getRelationShipJsonObject(), Relationship.class);
+
+ assertEquals(HttpStatus.ACCEPTED, responseEntity2.getStatusCode());
+
+ final String genericVnfUrl = getUrl(GENERIC_VNF_URL, VNF_ID);
+ final ResponseEntity<Void> genericVnfResponse =
+ testRestTemplateService.invokeHttpPut(genericVnfUrl, TestUtils.getGenericVnf(), Void.class);
+ assertEquals(HttpStatus.ACCEPTED, genericVnfResponse.getStatusCode());
+
+ final ResponseEntity<GenericVnfs> actual =
+ testRestTemplateService.invokeHttpGet(url + RELATED_TO_URL, GenericVnfs.class);
+
+ assertEquals(HttpStatus.OK, actual.getStatusCode());
+
+ assertTrue(actual.hasBody());
+ final GenericVnfs genericVnfs = actual.getBody();
+ assertFalse(genericVnfs.getGenericVnf().isEmpty());
+ final GenericVnf genericVnf = genericVnfs.getGenericVnf().get(0);
+ assertEquals(GENERIC_VNF_NAME, genericVnf.getVnfName());
+ }
+
+
+ @Test
public void test_DeleteSericeInstance_ServiceInstanceRemovedFromCache() throws Exception {
final String url = getUrl(CUSTOMERS_URL, SERVICE_SUBSCRIPTIONS_URL, SERVICE_INSTANCE_URL);
diff --git a/plans/so/integration-etsi-testing/so-simulators/package/docker/src/main/docker/docker-files/Dockerfile.so-simulator-base-image b/plans/so/integration-etsi-testing/so-simulators/package/docker/src/main/docker/docker-files/Dockerfile.so-simulator-base-image
index efd7833f..f227c63f 100644
--- a/plans/so/integration-etsi-testing/so-simulators/package/docker/src/main/docker/docker-files/Dockerfile.so-simulator-base-image
+++ b/plans/so/integration-etsi-testing/so-simulators/package/docker/src/main/docker/docker-files/Dockerfile.so-simulator-base-image
@@ -8,7 +8,8 @@ ENV http_proxy=$HTTP_PROXY
ENV https_proxy=$HTTPS_PROXY
# Update the package list and upgrade installed packages
-RUN apk update && apk upgrade
+USER root
+RUN apk update
# Install commonly needed tools
RUN apk --no-cache add curl netcat-openbsd sudo nss
@@ -24,6 +25,8 @@ COPY scripts/start-app.sh /app
RUN chown -R so:so /app && chmod 700 /app/*.sh
+USER so
+
# Springboot configuration (required)
VOLUME /app/config
diff --git a/plans/so/integration-etsi-testing/so-simulators/package/docker/src/main/docker/docker-files/Dockerfile.workaround-job-container b/plans/so/integration-etsi-testing/so-simulators/package/docker/src/main/docker/docker-files/Dockerfile.workaround-job-container
index faf8492c..795a015e 100644
--- a/plans/so/integration-etsi-testing/so-simulators/package/docker/src/main/docker/docker-files/Dockerfile.workaround-job-container
+++ b/plans/so/integration-etsi-testing/so-simulators/package/docker/src/main/docker/docker-files/Dockerfile.workaround-job-container
@@ -22,6 +22,7 @@
FROM docker.io/alpine
# Install packages
-RUN apk update && apk upgrade && apk add mysql-client && apk add bash
+USER root
+RUN apk upgrade && apk add mysql-client
-RUN apk --no-cache add curl netcat-openbsd sudo nss
+RUN apk --no-cache add bash curl netcat-openbsd sudo nss
diff --git a/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/pom.xml b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/pom.xml
index 27e7c3ea..e694fef1 100644
--- a/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/pom.xml
+++ b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/pom.xml
@@ -10,6 +10,11 @@
<name>${project.artifactId}</name>
<dependencies>
<dependency>
+ <groupId>${project.parent.groupId}</groupId>
+ <artifactId>common</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<exclusions>
diff --git a/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/configration/WebSecurityConfigImpl.java b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/configration/WebSecurityConfigImpl.java
index b2c51369..a8ede989 100644
--- a/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/configration/WebSecurityConfigImpl.java
+++ b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/configration/WebSecurityConfigImpl.java
@@ -20,15 +20,12 @@
package org.onap.so.sdcsimulator.configration;
import org.onap.so.sdcsimulator.utils.Constants;
+import org.onap.so.simulator.configuration.SimulatorSecurityConfigurer;
+import org.onap.so.simulator.model.UserCredentials;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
-import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
/**
* @author waqas.ikram@ericsson.com
@@ -36,18 +33,12 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
*/
@Configuration
@EnableWebSecurity
-public class WebSecurityConfigImpl extends WebSecurityConfigurerAdapter {
+public class WebSecurityConfigImpl extends SimulatorSecurityConfigurer {
- private final String username;
- private final String password;
- private final String role;
- public WebSecurityConfigImpl(@Value("${spring.security.username}") final String username,
- @Value("${spring.security.password}") final String password,
- @Value("${spring.security.role}") final String role) {
- this.username = username;
- this.password = password;
- this.role = role;
+ @Autowired
+ public WebSecurityConfigImpl(final UserCredentials userCredentials) {
+ super(userCredentials.getUsers());
}
@@ -57,15 +48,5 @@ public class WebSecurityConfigImpl extends WebSecurityConfigurerAdapter {
.httpBasic();
}
- @Bean
- public BCryptPasswordEncoder passwordEncoder() {
- return new BCryptPasswordEncoder();
- }
-
- @Autowired
- public void configureGlobal(final AuthenticationManagerBuilder auth) throws Exception {
- auth.inMemoryAuthentication().passwordEncoder(passwordEncoder()).withUser(username).password(password)
- .roles(role);
- }
}
diff --git a/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/controller/CatalogController.java b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/controller/CatalogController.java
index 60c1865d..eff63b84 100644
--- a/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/controller/CatalogController.java
+++ b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/controller/CatalogController.java
@@ -49,6 +49,12 @@ public class CatalogController {
this.resourceProvider = resourceProvider;
}
+ @GetMapping(value = "/resources", produces = {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+ public ResponseEntity<?> getResources() {
+ LOGGER.info("Running getResources ...");
+ return ResponseEntity.ok().body(resourceProvider.getResource());
+ }
+
@GetMapping(value = "/resources/{csarId}/toscaModel", produces = MediaType.APPLICATION_OCTET_STREAM)
public ResponseEntity<byte[]> getCsar(@PathVariable("csarId") final String csarId) {
LOGGER.info("Running getCsar for {} ...", csarId);
diff --git a/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/models/ResourceArtifact.java b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/models/ResourceArtifact.java
new file mode 100644
index 00000000..0b9e6cf1
--- /dev/null
+++ b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/models/ResourceArtifact.java
@@ -0,0 +1,245 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.sdcsimulator.models;
+
+import java.io.Serializable;
+import org.springframework.util.ObjectUtils;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * @author Waqas Ikram (waqas.ikram@est.tech)
+ *
+ */
+public class ResourceArtifact implements Serializable {
+
+ private static final long serialVersionUID = 3967660000071162759L;
+
+ @JsonProperty("uuid")
+ private String uuid;
+
+ @JsonProperty("invariantUUID")
+ private String invariantUuid;
+
+ @JsonProperty("name")
+ private String name;
+
+ @JsonProperty("version")
+ private String version;
+
+ @JsonProperty("toscaModelURL")
+ private String toscaModelUrl;
+
+ @JsonProperty("category")
+ private String category;
+
+ @JsonProperty("subCategory")
+ private String subCategory;
+
+ @JsonProperty("resourceType")
+ private String resourceType;
+
+ @JsonProperty("lifecycleState")
+ private String lifecycleState;
+
+ @JsonProperty("lastUpdaterUserId")
+ private String lastUpdaterUserId;
+
+ public String getUuid() {
+ return uuid;
+ }
+
+ public void setUuid(final String uuid) {
+ this.uuid = uuid;
+ }
+
+ public ResourceArtifact uuid(final String uuid) {
+ this.uuid = uuid;
+ return this;
+ }
+
+ public String getInvariantUuid() {
+ return invariantUuid;
+ }
+
+ public void setInvariantUuid(final String invariantUuid) {
+ this.invariantUuid = invariantUuid;
+ }
+
+ public ResourceArtifact invariantUuid(final String invariantUuid) {
+ this.invariantUuid = invariantUuid;
+ return this;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ public ResourceArtifact name(final String name) {
+ this.name = name;
+ return this;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(final String version) {
+ this.version = version;
+ }
+
+ public ResourceArtifact version(final String version) {
+ this.version = version;
+ return this;
+ }
+
+ public String getToscaModelUrl() {
+ return toscaModelUrl;
+ }
+
+ public void setToscaModelUrl(final String toscaModelUrl) {
+ this.toscaModelUrl = toscaModelUrl;
+ }
+
+ public ResourceArtifact toscaModelUrl(final String toscaModelUrl) {
+ this.toscaModelUrl = toscaModelUrl;
+ return this;
+ }
+
+ public String getCategory() {
+ return category;
+ }
+
+ public void setCategory(final String category) {
+ this.category = category;
+ }
+
+ public ResourceArtifact category(final String category) {
+ this.category = category;
+ return this;
+ }
+
+ public String getSubCategory() {
+ return subCategory;
+ }
+
+ public void setSubCategory(final String subCategory) {
+ this.subCategory = subCategory;
+ }
+
+ public ResourceArtifact subCategory(final String subCategory) {
+ this.subCategory = subCategory;
+ return this;
+ }
+
+ public String getResourceType() {
+ return resourceType;
+ }
+
+ public void setResourceType(final String resourceType) {
+ this.resourceType = resourceType;
+ }
+
+ public ResourceArtifact resourceType(final String resourceType) {
+ this.resourceType = resourceType;
+ return this;
+ }
+
+ public String getLifecycleState() {
+ return lifecycleState;
+ }
+
+ public void setLifecycleState(final String lifecycleState) {
+ this.lifecycleState = lifecycleState;
+ }
+
+ public ResourceArtifact lifecycleState(final String lifecycleState) {
+ this.lifecycleState = lifecycleState;
+ return this;
+ }
+
+ public String getLastUpdaterUserId() {
+ return lastUpdaterUserId;
+ }
+
+ public void setLastUpdaterUserId(final String lastUpdaterUserId) {
+ this.lastUpdaterUserId = lastUpdaterUserId;
+ }
+
+ public ResourceArtifact lastUpdaterUserId(final String lastUpdaterUserId) {
+ this.lastUpdaterUserId = lastUpdaterUserId;
+ return this;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((category == null) ? 0 : category.hashCode());
+ result = prime * result + ((invariantUuid == null) ? 0 : invariantUuid.hashCode());
+ result = prime * result + ((lastUpdaterUserId == null) ? 0 : lastUpdaterUserId.hashCode());
+ result = prime * result + ((lifecycleState == null) ? 0 : lifecycleState.hashCode());
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ result = prime * result + ((resourceType == null) ? 0 : resourceType.hashCode());
+ result = prime * result + ((subCategory == null) ? 0 : subCategory.hashCode());
+ result = prime * result + ((toscaModelUrl == null) ? 0 : toscaModelUrl.hashCode());
+ result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());
+ result = prime * result + ((version == null) ? 0 : version.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (obj instanceof ResourceArtifact) {
+ final ResourceArtifact other = (ResourceArtifact) obj;
+ return ObjectUtils.nullSafeEquals(category, other.category)
+ && ObjectUtils.nullSafeEquals(invariantUuid, other.invariantUuid)
+ && ObjectUtils.nullSafeEquals(lastUpdaterUserId, other.lastUpdaterUserId)
+ && ObjectUtils.nullSafeEquals(lifecycleState, other.lifecycleState)
+ && ObjectUtils.nullSafeEquals(name, other.name)
+ && ObjectUtils.nullSafeEquals(resourceType, other.resourceType)
+ && ObjectUtils.nullSafeEquals(subCategory, other.subCategory)
+ && ObjectUtils.nullSafeEquals(toscaModelUrl, other.toscaModelUrl)
+ && ObjectUtils.nullSafeEquals(uuid, other.uuid)
+ && ObjectUtils.nullSafeEquals(version, other.version);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("class ResourceArtifact {\n");
+ sb.append(" uuid: ").append(uuid).append("\n");
+ sb.append(" invariantUuid: ").append(invariantUuid).append("\n");
+ sb.append(" name: ").append(name).append("\n");
+ sb.append(" version: ").append(version).append("\n");
+ sb.append(" toscaModelUrl: ").append(toscaModelUrl).append("\n");
+ sb.append(" category: ").append(category).append("\n");
+ sb.append(" subCategory: ").append(subCategory).append("\n");
+ sb.append(" lastUpdaterUserId: ").append(lastUpdaterUserId).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+}
diff --git a/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/providers/ResourceProvider.java b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/providers/ResourceProvider.java
index 4d5dcdd0..48353a7c 100644
--- a/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/providers/ResourceProvider.java
+++ b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/providers/ResourceProvider.java
@@ -20,9 +20,9 @@
package org.onap.so.sdcsimulator.providers;
-import java.io.IOException;
-import java.io.InputStream;
import java.util.Optional;
+import java.util.Set;
+import org.onap.so.sdcsimulator.models.ResourceArtifact;
/**
* @author Eoin Hanan (eoin.hanan@est.tech)
@@ -31,6 +31,6 @@ public interface ResourceProvider {
Optional<byte[]> getResource(final String csarId);
- Optional<InputStream> getInputStream(final String csarId) throws IOException;
+ Set<ResourceArtifact> getResource();
}
diff --git a/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/providers/ResourceProviderImpl.java b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/providers/ResourceProviderImpl.java
index 192ac896..eacc9d5c 100644
--- a/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/providers/ResourceProviderImpl.java
+++ b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/providers/ResourceProviderImpl.java
@@ -20,17 +20,29 @@
package org.onap.so.sdcsimulator.providers;
+import static org.onap.so.sdcsimulator.utils.Constants.CATALOG_URL;
+import static org.onap.so.sdcsimulator.utils.Constants.DOT_CSAR;
+import static org.onap.so.sdcsimulator.utils.Constants.MAIN_RESOURCE_FOLDER;
+import static org.onap.so.sdcsimulator.utils.Constants.WILD_CARD_REGEX;
+import static org.springframework.core.io.support.ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX;
import java.io.IOException;
import java.io.InputStream;
+import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.util.HashSet;
import java.util.Optional;
+import java.util.Set;
+import org.onap.so.sdcsimulator.models.ResourceArtifact;
import org.onap.so.sdcsimulator.utils.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.stereotype.Service;
import org.springframework.util.StreamUtils;
@@ -44,8 +56,13 @@ public class ResourceProviderImpl implements ResourceProvider {
private final String resourceLocation;
- public ResourceProviderImpl(@Value("${sdc.resource.location:/app/csars/}") final String resourceLocation) {
+ private final ResourcePatternResolver resourcePatternResolver;
+
+ @Autowired
+ public ResourceProviderImpl(@Value("${sdc.resource.location:/app/csars/}") final String resourceLocation,
+ final ResourcePatternResolver resourcePatternResolver) {
this.resourceLocation = resourceLocation;
+ this.resourcePatternResolver = resourcePatternResolver;
}
@Override
@@ -63,15 +80,80 @@ public class ResourceProviderImpl implements ResourceProvider {
}
@Override
- public Optional<InputStream> getInputStream(final String csarId) throws IOException {
- final Path filePath = Paths.get(resourceLocation, csarId + ".csar");
+ public Set<ResourceArtifact> getResource() {
+ final Set<ResourceArtifact> result = new HashSet<>();
+
+ final Path dir = Paths.get(resourceLocation);
+ if (Files.exists(dir)) {
+ try (final DirectoryStream<Path> stream = Files.newDirectoryStream(dir, WILD_CARD_REGEX + DOT_CSAR)) {
+ for (final Path entry : stream) {
+ final String filename = getFilenameWithoutExtension(entry);
+ final ResourceArtifact artifact = getResourceArtifact(filename);
+ result.add(artifact);
+ LOGGER.info("Found resource on file system: {}", artifact);
+
+
+ }
+ } catch (final IOException ioException) {
+ LOGGER.error("Unable to find resources on filesystem", ioException);
+ }
+ }
+
+ try {
+ final String csarFileLocationPattern =
+ CLASSPATH_ALL_URL_PREFIX + MAIN_RESOURCE_FOLDER + WILD_CARD_REGEX + DOT_CSAR;
+ final Resource[] resources = resourcePatternResolver.getResources(csarFileLocationPattern);
+ if (resources != null) {
+
+ for (final Resource resource : resources) {
+ final ResourceArtifact artifact =
+ getResourceArtifact(getFilenameWithoutExtension(resource.getFilename()));
+ result.add(artifact);
+ LOGGER.info("Found resource in classpath: {}", artifact);
+ }
+ }
+
+ } catch (final IOException ioException) {
+ LOGGER.error("Unable to find resources in classpath", ioException);
+ }
+
+ return result;
+ }
+
+ private ResourceArtifact getResourceArtifact(final String filename) {
+ return new ResourceArtifact().uuid(filename).invariantUuid(filename).name(filename).version("1.0")
+ .toscaModelUrl(CATALOG_URL + "/resources/" + filename + "/toscaModel").category("Generic")
+ .subCategory("Network Service").resourceType("VF").lifecycleState("CERTIFIED")
+ .lastUpdaterUserId("SDC_SIMULATOR");
+ }
+
+ private String getFilenameWithoutExtension(final String filename) {
+ return filename.substring(0, filename.lastIndexOf('.'));
+ }
+
+ private String getFilenameWithoutExtension(final Path file) {
+ return getFilenameWithoutExtension(file.getFileName().toString());
+ }
+
+ private Optional<InputStream> getInputStream(final String csarId) throws IOException {
+ final Path filePath = Paths.get(resourceLocation, csarId + DOT_CSAR);
if (Files.exists(filePath)) {
+ LOGGER.info("Found resource in on file system using path: {}", filePath);
return Optional.of(Files.newInputStream(filePath));
}
+ LOGGER.warn("Couldn't find file on file system '{}', will search it in classpath", filePath);
- LOGGER.info("Couldn't find file on file system '{}', will return default csar", filePath);
- final ClassPathResource classPathResource = new ClassPathResource(getDefaultCsarPath(), this.getClass());
+ final String path = MAIN_RESOURCE_FOLDER + csarId + DOT_CSAR;
+ ClassPathResource classPathResource = getClassPathResource(path);
if (classPathResource.exists()) {
+ LOGGER.info("Found resource in classpath using path: {}", path);
+ return Optional.of(classPathResource.getInputStream());
+ }
+
+ LOGGER.warn("Couldn't find file on file system '{}', will return default csar", filePath);
+ classPathResource = getClassPathResource(getDefaultCsarPath());
+ if (classPathResource.exists()) {
+ LOGGER.info("Found default csar in classpath");
return Optional.of(classPathResource.getInputStream());
}
@@ -79,10 +161,14 @@ public class ResourceProviderImpl implements ResourceProvider {
return Optional.empty();
}
+ private ClassPathResource getClassPathResource(final String path) {
+ return new ClassPathResource(path, this.getClass());
+ }
+
/*
* Used in test
*/
String getDefaultCsarPath() {
return Constants.DEFAULT_CSAR_PATH;
}
-} \ No newline at end of file
+}
diff --git a/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/utils/Constants.java b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/utils/Constants.java
index e8412574..3ddb5bee 100644
--- a/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/utils/Constants.java
+++ b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/java/org/onap/so/sdcsimulator/utils/Constants.java
@@ -25,6 +25,8 @@ package org.onap.so.sdcsimulator.utils;
*/
public class Constants {
+ public static final String MAIN_RESOURCE_FOLDER = "/csar/";
+
public static final String BASE_URL = "/sdc/v1";
public static final String CATALOG_URL = BASE_URL + "/catalog";
@@ -35,11 +37,13 @@ public class Constants {
public static final String DOT = ".";
+ public static final String WILD_CARD_REGEX = "*";
+
public static final String DOT_CSAR = DOT + "csar";
public static final String DEFAULT_CSAR_NAME_WITH_EXT = DEFAULT_CSAR_NAME + DOT_CSAR;
- public static final String DEFAULT_CSAR_PATH = "/csar/" + DEFAULT_CSAR_NAME_WITH_EXT;
+ public static final String DEFAULT_CSAR_PATH = MAIN_RESOURCE_FOLDER + DEFAULT_CSAR_NAME_WITH_EXT;
private Constants() {}
}
diff --git a/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/resources/application.yaml b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/resources/application.yaml
index 5bb7950a..8ae1e8ac 100644
--- a/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/resources/application.yaml
+++ b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/resources/application.yaml
@@ -5,7 +5,12 @@ server:
ssl-enable: false
spring:
security:
- username: mso
- #password: Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U
- password: $2a$04$Lcu/DWdyXsl/a3A0iqHTfOX1.zHQ3DlQS/nOPfafT.9pWbeEqlF7W
- role: mso \ No newline at end of file
+ users:
+ - username: mso
+ #password: Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U
+ password: $2a$04$Lcu/DWdyXsl/a3A0iqHTfOX1.zHQ3DlQS/nOPfafT.9pWbeEqlF7W
+ role: mso
+ - username: modeling
+ #password: Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U
+ password: $2a$04$Lcu/DWdyXsl/a3A0iqHTfOX1.zHQ3DlQS/nOPfafT.9pWbeEqlF7W
+ role: mso \ No newline at end of file
diff --git a/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/resources/csar/73522444-e8e9-49c1-be29-d355800aa349.csar b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/resources/csar/73522444-e8e9-49c1-be29-d355800aa349.csar
new file mode 100644
index 00000000..db8f12d8
--- /dev/null
+++ b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/resources/csar/73522444-e8e9-49c1-be29-d355800aa349.csar
Binary files differ
diff --git a/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/resources/csar/ba1c0c0e-9fb8-4b83-97bb-5e9af1e73393.csar b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/resources/csar/ba1c0c0e-9fb8-4b83-97bb-5e9af1e73393.csar
new file mode 100644
index 00000000..4e0400fa
--- /dev/null
+++ b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/main/resources/csar/ba1c0c0e-9fb8-4b83-97bb-5e9af1e73393.csar
Binary files differ
diff --git a/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/test/java/org/onap/so/sdcsimulator/controller/CatalogControllerTest.java b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/test/java/org/onap/so/sdcsimulator/controller/CatalogControllerTest.java
index ca55f495..e63a7f90 100644
--- a/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/test/java/org/onap/so/sdcsimulator/controller/CatalogControllerTest.java
+++ b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/test/java/org/onap/so/sdcsimulator/controller/CatalogControllerTest.java
@@ -24,19 +24,21 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Base64;
import java.util.Optional;
+import java.util.Set;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
-import org.onap.so.sdcsimulator.controller.CatalogController;
+import org.onap.so.sdcsimulator.models.ResourceArtifact;
import org.onap.so.sdcsimulator.providers.ResourceProvider;
import org.onap.so.sdcsimulator.utils.Constants;
+import org.onap.so.simulator.model.UserCredentials;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.context.annotation.Configuration;
+import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
@@ -64,8 +66,8 @@ public class CatalogControllerTest {
@Autowired
private TestRestTemplate restTemplate;
- @Value("${spring.security.username}")
- private String username;
+ @Autowired
+ private UserCredentials userCredentials;
@Test
public void test_getCsar_validCsarId_matchContent() {
@@ -82,6 +84,19 @@ public class CatalogControllerTest {
}
@Test
+ public void test_getResources_validResourcesFromClassPath() {
+
+ final ResponseEntity<Set<ResourceArtifact>> response =
+ restTemplate.exchange(getBaseUrl() + "/resources", HttpMethod.GET, new HttpEntity<>(getHttpHeaders()),
+ new ParameterizedTypeReference<Set<ResourceArtifact>>() {});
+
+ assertEquals(HttpStatus.OK, response.getStatusCode());
+ assertTrue(response.hasBody());
+ assertEquals(3, response.getBody().size());
+
+ }
+
+ @Test
public void test_getCsar_invalidCsar_internalServerError() {
final ResourceProvider mockedResourceProvider = Mockito.mock(ResourceProvider.class);
Mockito.when(mockedResourceProvider.getResource(Mockito.anyString())).thenReturn(Optional.empty());
@@ -99,7 +114,7 @@ public class CatalogControllerTest {
private HttpHeaders getHttpHeaders() {
final HttpHeaders requestHeaders = new HttpHeaders();
- requestHeaders.add("Authorization", getBasicAuth(username));
+ requestHeaders.add("Authorization", getBasicAuth(userCredentials.getUsers().get(0).getUsername()));
requestHeaders.setContentType(MediaType.APPLICATION_JSON);
return requestHeaders;
}
diff --git a/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/test/java/org/onap/so/sdcsimulator/providers/ResourceProviderImplTest.java b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/test/java/org/onap/so/sdcsimulator/providers/ResourceProviderImplTest.java
index a7cb5dd7..c132184c 100644
--- a/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/test/java/org/onap/so/sdcsimulator/providers/ResourceProviderImplTest.java
+++ b/plans/so/integration-etsi-testing/so-simulators/sdc-simulator/src/test/java/org/onap/so/sdcsimulator/providers/ResourceProviderImplTest.java
@@ -26,11 +26,13 @@ import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.util.UUID;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.onap.so.sdcsimulator.utils.Constants;
import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.util.StreamUtils;
/**
@@ -42,18 +44,22 @@ public class ResourceProviderImplTest {
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();
- private static final String DUMMY_CONTENT = "Hell world";
+ private static final String DUMMY_CONTENT = "Hello world";
+
+ private final PathMatchingResourcePatternResolver resourcePatternResolver =
+ new PathMatchingResourcePatternResolver();
@Test
public void test_getResource_withValidPath_matchContent() throws IOException {
final File folder = temporaryFolder.newFolder();
- final Path file = Files.createFile(folder.toPath().resolve("empty.csar"));
+ final String uuid = UUID.randomUUID().toString();
+ final Path file = Files.createFile(folder.toPath().resolve(uuid + Constants.DOT_CSAR));
Files.write(file, DUMMY_CONTENT.getBytes());
- final ResourceProviderImpl objUnderTest = new ResourceProviderImpl(folder.getPath());
+ final ResourceProviderImpl objUnderTest = new ResourceProviderImpl(folder.getPath(), resourcePatternResolver);
- assertArrayEquals(DUMMY_CONTENT.getBytes(), objUnderTest.getResource("empty").get());
+ assertArrayEquals(DUMMY_CONTENT.getBytes(), objUnderTest.getResource(uuid).get());
}
@Test
@@ -62,21 +68,21 @@ public class ResourceProviderImplTest {
final byte[] expectedResult = StreamUtils.copyToByteArray(classPathResource.getInputStream());
- final ResourceProviderImpl objUnderTest = new ResourceProviderImpl("");
+ final ResourceProviderImpl objUnderTest = new ResourceProviderImpl("", resourcePatternResolver);
assertArrayEquals(expectedResult, objUnderTest.getResource(Constants.DEFAULT_CSAR_NAME).get());
}
@Test
- public void test_getResource_unbleToreadFileFromClasspath_emptyOptional() throws IOException {
+ public void test_getResource_unbleToReadFileFromClasspath_emptyOptional() throws IOException {
- final ResourceProviderImpl objUnderTest = new ResourceProviderImpl("") {
+ final ResourceProviderImpl objUnderTest = new ResourceProviderImpl("", resourcePatternResolver) {
@Override
String getDefaultCsarPath() {
return "/some/dummy/path";
}
};
- assertFalse(objUnderTest.getResource(Constants.DEFAULT_CSAR_NAME).isPresent());
+ assertFalse(objUnderTest.getResource(UUID.randomUUID().toString()).isPresent());
}
}
diff --git a/plans/so/integration-etsi-testing/so-simulators/vnfm-simulator/vnfm-service/src/main/java/org/onap/so/svnfm/simulator/model/Vnfds.java b/plans/so/integration-etsi-testing/so-simulators/vnfm-simulator/vnfm-service/src/main/java/org/onap/so/svnfm/simulator/model/Vnfds.java
index cf550067..6fe696ee 100644
--- a/plans/so/integration-etsi-testing/so-simulators/vnfm-simulator/vnfm-service/src/main/java/org/onap/so/svnfm/simulator/model/Vnfds.java
+++ b/plans/so/integration-etsi-testing/so-simulators/vnfm-simulator/vnfm-service/src/main/java/org/onap/so/svnfm/simulator/model/Vnfds.java
@@ -31,6 +31,17 @@ public class Vnfds {
public void setVnfcList(final List<Vnfc> vnfclist) {
this.vnfclist = vnfclist;
}
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("class Vnfd {\n");
+ sb.append(" vnfdId: ").append(vnfdId).append("\n");
+ sb.append(" vnfclist: ").append(vnfclist).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
}
@@ -82,8 +93,20 @@ public class Vnfds {
this.grantResourceId = grantResourceId;
}
- }
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("class Vnfc {\n");
+ sb.append(" vnfcId: ").append(vnfcId).append("\n");
+ sb.append(" type: ").append(type).append("\n");
+ sb.append(" vduId: ").append(vduId).append("\n");
+ sb.append(" resourceTemplateId: ").append(resourceTemplateId).append("\n");
+ sb.append(" grantResourceId: ").append(grantResourceId).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+ }
public List<Vnfd> getVnfdList() {
return vnfdList;
@@ -94,4 +117,15 @@ public class Vnfds {
this.vnfdList = vnfdList;
}
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("class Vnfds {\n");
+ sb.append(" vnfdList: ").append(vnfdList).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+
+
}
diff --git a/plans/so/integration-etsi-testing/so-simulators/vnfm-simulator/vnfm-service/src/main/java/org/onap/so/svnfm/simulator/services/InstantiateOperationProgressor.java b/plans/so/integration-etsi-testing/so-simulators/vnfm-simulator/vnfm-service/src/main/java/org/onap/so/svnfm/simulator/services/InstantiateOperationProgressor.java
index 0a5444b9..6b483548 100644
--- a/plans/so/integration-etsi-testing/so-simulators/vnfm-simulator/vnfm-service/src/main/java/org/onap/so/svnfm/simulator/services/InstantiateOperationProgressor.java
+++ b/plans/so/integration-etsi-testing/so-simulators/vnfm-simulator/vnfm-service/src/main/java/org/onap/so/svnfm/simulator/services/InstantiateOperationProgressor.java
@@ -40,9 +40,10 @@ public class InstantiateOperationProgressor extends OperationProgressor {
@Override
protected List<GrantsAddResources> getAddResources(final String vnfdId) {
final List<GrantsAddResources> resources = new ArrayList<>();
-
+ LOGGER.info("Will find GrantsAddResources for vnfdId: {}", vnfdId);
for (final Vnfd vnfd : vnfds.getVnfdList()) {
if (vnfd.getVnfdId().equals(vnfdId)) {
+ LOGGER.info("Found vnfd: {}", vnfd);
for (final Vnfc vnfc : vnfd.getVnfcList()) {
final GrantsAddResources addResource = new GrantsAddResources();
vnfc.setGrantResourceId(UUID.randomUUID().toString());
@@ -80,9 +81,12 @@ public class InstantiateOperationProgressor extends OperationProgressor {
addResource.getVimConnectionId());
}
LOGGER.info("VIM connections in grant response: {}", mapOfGrantResourceIdToVimConnectionId);
+ final String vnfInstanceId = operation.getVnfInstanceId();
+
+ LOGGER.info("vnfds: {}", vnfds);
for (final Vnfd vnfd : vnfds.getVnfdList()) {
- if (vnfd.getVnfdId().equals(svnfmService.getVnf(operation.getVnfInstanceId()).getVnfdId())) {
+ if (vnfd.getVnfdId().equals(svnfmService.getVnf(vnfInstanceId).getVnfdId())) {
for (final Vnfc vnfc : vnfd.getVnfcList()) {
final InlineResponse201InstantiatedVnfInfoVnfcResourceInfo vnfcResourceInfoItem =
new InlineResponse201InstantiatedVnfInfoVnfcResourceInfo();
diff --git a/plans/so/integration-etsi-testing/so-simulators/vnfm-simulator/vnfm-service/src/main/java/org/onap/so/svnfm/simulator/services/TerminateOperationProgressor.java b/plans/so/integration-etsi-testing/so-simulators/vnfm-simulator/vnfm-service/src/main/java/org/onap/so/svnfm/simulator/services/TerminateOperationProgressor.java
index bd729f3a..9257e49f 100644
--- a/plans/so/integration-etsi-testing/so-simulators/vnfm-simulator/vnfm-service/src/main/java/org/onap/so/svnfm/simulator/services/TerminateOperationProgressor.java
+++ b/plans/so/integration-etsi-testing/so-simulators/vnfm-simulator/vnfm-service/src/main/java/org/onap/so/svnfm/simulator/services/TerminateOperationProgressor.java
@@ -12,12 +12,15 @@ import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.LcnVnfLcmOpera
import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse201.InstantiationStateEnum;
import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse201InstantiatedVnfInfoResourceHandle;
import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse201InstantiatedVnfInfoVnfcResourceInfo;
-import org.onap.so.svnfm.simulator.model.Vnfds;
-import org.onap.so.svnfm.simulator.repository.VnfOperationRepository;
import org.onap.so.svnfm.simulator.config.ApplicationConfig;
import org.onap.so.svnfm.simulator.model.VnfOperation;
+import org.onap.so.svnfm.simulator.model.Vnfds;
+import org.onap.so.svnfm.simulator.repository.VnfOperationRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class TerminateOperationProgressor extends OperationProgressor {
+ private static final Logger LOGGER = LoggerFactory.getLogger(TerminateOperationProgressor.class);
public TerminateOperationProgressor(final VnfOperation operation, final SvnfmService svnfmService,
final VnfOperationRepository vnfOperationRepository, final ApplicationConfig applicationConfig,
@@ -33,9 +36,12 @@ public class TerminateOperationProgressor extends OperationProgressor {
@Override
protected List<GrantsAddResources> getRemoveResources(final String vnfdId) {
final List<GrantsAddResources> resources = new ArrayList<>();
+ LOGGER.info("Will find RemoveResources for vnfdId: {}", vnfdId);
+ final String vnfInstanceId = operation.getVnfInstanceId();
final org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse201 vnf =
- svnfmService.getVnf(operation.getVnfInstanceId());
+ svnfmService.getVnf(vnfInstanceId);
+ LOGGER.info("Found InlineResponse201: {} for vnfInstanceId: {}", vnf, vnfInstanceId);
for (final InlineResponse201InstantiatedVnfInfoVnfcResourceInfo vnfc : vnf.getInstantiatedVnfInfo()
.getVnfcResourceInfo()) {
final GrantsAddResources addResource = new GrantsAddResources();
diff --git a/plans/usecases-config-over-netconf/config-over-netconf/cds/cds_setup.sh b/plans/usecases-config-over-netconf/config-over-netconf/cds/cds_setup.sh
deleted file mode 100755
index b595e6b1..00000000
--- a/plans/usecases-config-over-netconf/config-over-netconf/cds/cds_setup.sh
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/bin/bash
-#
-# ============LICENSE_START=======================================================
-# Copyright (C) 2019 Nordix Foundation.
-# ================================================================================
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# SPDX-License-Identifier: Apache-2.0
-# ============LICENSE_END=========================================================
-
-# @author Rahul Tyagi (rahul.tyagi@est.tech)
-
-CDS_DATA_PATH=$WORKSPACE/plans/$PARENT/$SUB_PARENT/cds
-
-cd $CDS_DATA_PATH
-export LOCAL_IP=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')
-unset http_proxy https_proxy
-
-#cd $WORKSPACE/archives/cds/ms/blueprintsprocessor/distribution/src/main/dc/
-
-############# update ip of sdnc in docker-compose###########
-SDNC_CONTAINER=$(docker ps -a -q --filter="name=sdnc_controller_container")
-SDNC_CONTAINER_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $SDNC_CONTAINER)
-echo " " >> docker-compose.yaml
-echo " extra_hosts:" >> docker-compose.yaml
-echo " - 'sdnc:$LOCAL_IP'" >> docker-compose.yaml
-#############################################################
-
-docker-compose up -d
-sleep 10
-################# Check state of BP ####################
-BP_CONTAINER=$(docker ps -a -q --filter="name=bp-rest")
-CCSDK_MARIADB=$(docker ps -a -q --filter="name=ccsdk-mariadb")
-for i in {1..10}; do
-if [ $(docker inspect --format='{{ .State.Running }}' $BP_CONTAINER) ] && \
-[ $(docker inspect --format='{{ .State.Running }}' $CCSDK_MARIADB) ]
-then
- echo "Blueprint proc Service Running"
- break
-else
- echo sleep $i
- sleep $i
-fi
-done
-
diff --git a/plans/usecases-config-over-netconf/config-over-netconf/cds/docker-compose.yaml b/plans/usecases-config-over-netconf/config-over-netconf/cds/docker-compose.yaml
index 4834f912..f914e48c 100755
--- a/plans/usecases-config-over-netconf/config-over-netconf/cds/docker-compose.yaml
+++ b/plans/usecases-config-over-netconf/config-over-netconf/cds/docker-compose.yaml
@@ -23,9 +23,17 @@ services:
- "8000:8080"
restart: always
environment:
- APPLICATIONNAME: BlueprintsProcessor
- BUNDLEVERSION: 1.0.0
- APP_CONFIG_HOME: /opt/app/onap/config
- STICKYSELECTORKEY:
- ENVCONTEXT: dev
+ - APPLICATIONNAME=BlueprintsProcessor
+ - BUNDLEVERSION=1.0.0
+ - APP_CONFIG_HOME=/opt/app/onap/config
+ - ENVCONTEXT=dev
+ volumes:
+ - /etc/localtime:/etc/localtime:ro
+ - ${WORKSPACE}/plans/usecases-config-over-netconf/config-over-netconf/cds/resources:/opt/app/onap/res
+ entrypoint:
+ - /bin/sh
+ - -c
+ - "/opt/app/onap/res/importCerAndStartService.sh"
+ extra_hosts:
+ - sdnc:${LOCAL_IP}
diff --git a/plans/usecases-config-over-netconf/config-over-netconf/cds/resources/application.properties b/plans/usecases-config-over-netconf/config-over-netconf/cds/resources/application.properties
new file mode 100755
index 00000000..34d572e5
--- /dev/null
+++ b/plans/usecases-config-over-netconf/config-over-netconf/cds/resources/application.properties
@@ -0,0 +1,97 @@
+# Web Server Configurations
+# START -Controller Blueprints Properties & Load Resource Source Mappings
+resourceSourceMappings=processor-db=source-db,input=source-input,default=source-default,sdnc=source-rest,aai-data=source-rest,capability=source-capability,rest=source-rest,vault-data=source-rest,script=source-capability
+
+# Controller Blueprints Core Configuration
+blueprintsprocessor.blueprintDeployPath=/opt/app/onap/blueprints/deploy
+blueprintsprocessor.blueprintArchivePath=/opt/app/onap/blueprints/archive
+blueprintsprocessor.blueprintWorkingPath=/opt/app/onap/blueprints/working
+
+# Controller Blueprint Load Configurations
+blueprintsprocessor.loadBluePrintPaths=/opt/app/onap/model-catalog/blueprint-model
+blueprintsprocessor.loadModeTypePaths=/opt/app/onap/model-catalog/definition-type
+blueprintsprocessor.loadResourceDictionaryPaths=/opt/app/onap/model-catalog/resource-dictionary
+
+# CBA file extension
+controllerblueprints.loadCbaExtension=zip
+
+### END -Controller Blueprints Properties
+
+blueprintsprocessor.grpcEnable=true
+blueprintsprocessor.httpPort=8080
+blueprintsprocessor.grpcPort=9111
+
+# DB
+blueprintsprocessor.db.url=jdbc:mysql://db:3306/sdnctl
+blueprintsprocessor.db.username=sdnctl
+blueprintsprocessor.db.password=sdnctl
+blueprintsprocessor.db.driverClassName=org.mariadb.jdbc.Driver
+blueprintsprocessor.db.hibernateHbm2ddlAuto=update
+blueprintsprocessor.db.hibernateDDLAuto=update
+blueprintsprocessor.db.hibernateNamingStrategy=org.hibernate.cfg.ImprovedNamingStrategy
+blueprintsprocessor.db.hibernateDialect=org.hibernate.dialect.MySQL5InnoDBDialect
+
+# Processor-DB Endpoint
+blueprintsprocessor.db.processor-db.type=maria-db
+blueprintsprocessor.db.processor-db.url=jdbc:mysql://mariadb-galera:3306/sdnctl
+blueprintsprocessor.db.processor-db.username=root
+blueprintsprocessor.db.processor-db.password=secretpassword
+
+# Python Executor
+blueprints.processor.functions.python.executor.executionPath=/opt/app/onap/scripts/jython/ccsdk_blueprints
+blueprints.processor.functions.python.executor.modulePaths=/opt/app/onap/scripts/jython/ccsdk_blueprints,/opt/app/onap/scripts/jython/ccsdk_netconf,/opt/app/onap/scripts/jython/ccsdk_restconf
+
+security.user.password: {bcrypt}$2a$10$duaUzVUVW0YPQCSIbGEkQOXwafZGwQ/b32/Ys4R1iwSSawFgz7QNu
+security.user.name: ccsdkapps
+
+# Used in Health Check
+#endpoints.user.name=ccsdkapps
+#endpoints.user.password=ccsdkapps
+
+# Executor Options
+blueprintsprocessor.resourceResolution.enabled=true
+blueprintsprocessor.netconfExecutor.enabled=true
+blueprintsprocessor.restConfExecutor.enabled=true
+blueprintsprocessor.cliExecutor.enabled=true
+blueprintsprocessor.remoteScriptCommand.enabled=true
+
+# Command Executor
+blueprintsprocessor.grpcclient.remote-python.type=token-auth
+blueprintsprocessor.grpcclient.remote-python.host=localhost
+blueprintsprocessor.grpcclient.remote-python.port=50051
+blueprintsprocessor.grpcclient.remote-python.token=Basic Y2NzZGthcHBzOmNjc2RrYXBwcw==
+
+# Python Executor
+blueprintsprocessor.grpcclient.py-executor.type=tls-auth
+blueprintsprocessor.grpcclient.py-executor.host=py-executor-default:50052
+blueprintsprocessor.grpcclient.py-executor.trustCertCollection=/opt/app/onap/config/certs/py-executor/py-executor-chain.pem
+
+# Config Data REST client settings
+blueprintsprocessor.restconfEnabled=true
+blueprintsprocessor.restclient.sdnc.type=basic-auth
+blueprintsprocessor.restclient.sdnc.url=http://sdnc:8282
+blueprintsprocessor.restclient.sdnc.username=admin
+blueprintsprocessor.restclient.sdnc.password=Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U
+blueprintprocessor.remoteScriptCommand.enabled=true
+
+# Encrypted username and password for health check service
+endpoints.user.name=eHbVUbJAj4AG2522cSbrOQ==
+endpoints.user.password=eHbVUbJAj4AG2522cSbrOQ==
+
+# BaseUrls for health check blueprint processor services
+blueprintprocessor.healthcheck.baseUrl=http://localhost:8080/
+blueprintprocessor.healthcheck.mapping-service-name-with-service-link=[Execution service,/api/v1/execution-service/health-check],[Resources service,/api/v1/resources/health-check],[Template service,/api/v1/template/health-check]
+
+# BaseUrls for health check Cds Listener services
+cdslistener.healthcheck.baseUrl=http://cds-sdc-listener:8080/
+cdslistener.healthcheck.mapping-service-name-with-service-link=[SDC Listener service,/api/v1/sdclistener/healthcheck]
+
+# Actuator Properties
+management.endpoints.web.exposure.include=*
+management.endpoint.health.show-details=always
+management.info.git.mode=full
+
+# Error Managements
+error.catalog.applicationId=cds
+error.catalog.type=properties
+error.catalog.errorDefinitionDir=/opt/app/onap/config/ \ No newline at end of file
diff --git a/plans/usecases-config-over-netconf/config-over-netconf/cds/resources/error-messages_en.properties b/plans/usecases-config-over-netconf/config-over-netconf/cds/resources/error-messages_en.properties
new file mode 100755
index 00000000..3b731c70
--- /dev/null
+++ b/plans/usecases-config-over-netconf/config-over-netconf/cds/resources/error-messages_en.properties
@@ -0,0 +1,77 @@
+# Error Messages Configurations
+
+org.onap.ccsdk.cds.blueprintsprocessor.generic_failure=cause=Internal error in Blueprint Processor run time.,action=Contact CDS administrator team.
+org.onap.ccsdk.cds.blueprintsprocessor.resource_path_missing=cause=Resource path missing or wrong.,action=Please reload your artifact in run time.
+org.onap.ccsdk.cds.blueprintsprocessor.resource_writing_fail=cause=Fail to write resources files.,action=Please reload your files and make sure it is in the right format.
+org.onap.ccsdk.cds.blueprintsprocessor.io_file_interrupt=cause=IO file system interruption.,action=Please reload your file and make sure it is in the right format.
+org.onap.ccsdk.cds.blueprintsprocessor.invalid_request_format=cause=bad request provided.,action=Verify the request payload.
+org.onap.ccsdk.cds.blueprintsprocessor.unauthorized_request=cause=The request requires user authentication.,action=Please provide the right credentials.
+org.onap.ccsdk.cds.blueprintsprocessor.request_not_found=cause=Request mapping doesn't exist.,action=Please verify your request.
+org.onap.ccsdk.cds.blueprintsprocessor.conflict_adding_resource=cause=Duplicated entry while saving resource.,action=Please make the saving model doesn't exist.
+org.onap.ccsdk.cds.blueprintsprocessor.duplicate_data=cause=Duplicated data - was expecting one result, got more than one.,action=Please provide single resource at a time.
+org.onap.ccsdk.cds.blueprintsprocessor.resource_not_found=cause=No response was found for this request in the server.,action=Provide the ID to find the resource.
+org.onap.ccsdk.cds.blueprintsprocessor.unsupported_media_type=cause=An invalid media was provided.,action=Please make sure your media or artifact is in the proper structure or format.
+
+# Self Service API
+org.onap.ccsdk.cds.blueprintsprocessor.selfservice.api.generic_failure=cause=Internal error in Self Service API.,action=Verify the request and try again.
+org.onap.ccsdk.cds.blueprintsprocessor.selfservice.api.generic_process_failure=cause=Internal error while processing REST call to the Self Service API.,action=Verify the request and try again.
+org.onap.ccsdk.cds.blueprintsprocessor.selfservice.api.invalid_file_extension=cause=Failed trying to upload a non ZIP file format.,action=Please reload your file and make sure it is in ZIP format.
+org.onap.ccsdk.cds.blueprintsprocessor.selfservice.api.resource_path_missing=cause=Resource path missing or wrong.,action=Please reload your artifact in run time.
+org.onap.ccsdk.cds.blueprintsprocessor.selfservice.api.resource_writing_fail=cause=Fail to write resources files.,action=Please reload your files and make sure it is in the right format.
+org.onap.ccsdk.cds.blueprintsprocessor.selfservice.api.io_file_interrupt=cause=IO file system interruption.,action=Please reload your file and make sure it is in the right format.
+org.onap.ccsdk.cds.blueprintsprocessor.selfservice.api.invalid_request_format=cause=bad request provided.,action=Verify the request payload.
+org.onap.ccsdk.cds.blueprintsprocessor.selfservice.api.unauthorized_request=cause=The request requires user authentication.,action=Please provide the right credentials.
+org.onap.ccsdk.cds.blueprintsprocessor.selfservice.api.request_not_found=cause=Request mapping doesn't exist.,action=Please verify your request.
+org.onap.ccsdk.cds.blueprintsprocessor.selfservice.api.conflict_adding_resource=cause=Duplicated entry while saving resource.,action=Please make the saving model doesn't exist.
+org.onap.ccsdk.cds.blueprintsprocessor.selfservice.api.duplicate_data=cause=Duplicated data - was expecting one result, got more than one.,action=Please provide single resource at a time.
+org.onap.ccsdk.cds.blueprintsprocessor.selfservice.api.resource_not_found=cause=No response was found for this request in the server.,action=Provide the ID to find the resource.
+org.onap.ccsdk.cds.blueprintsprocessor.selfservice.api.unsupported_media_type=cause=An invalid media was provided.,action=Please make sure your media or artifact is in the proper structure or format.
+
+# Designer API
+org.onap.ccsdk.cds.blueprintsprocessor.designer.api.generic_failure=cause=Internal error while processing REST call to the Designer API.,action=Verify the request and try again.
+org.onap.ccsdk.cds.blueprintsprocessor.designer.api.invalid_file_extension=cause=Failed trying to upload a non ZIP file format.,action=Please reload your file and make sure it is in ZIP format.
+org.onap.ccsdk.cds.blueprintsprocessor.designer.api.resource_path_missing=cause=Resource path missing or wrong.,action=Please reload your artifact in run time.
+org.onap.ccsdk.cds.blueprintsprocessor.designer.api.resource_writing_fail=cause=Fail to write resources files.,action=Please reload your files and make sure it is in the right format.
+org.onap.ccsdk.cds.blueprintsprocessor.designer.api.io_file_interrupt=cause=IO file system interruption.,action=Please reload your file and make sure it is in the right format.
+org.onap.ccsdk.cds.blueprintsprocessor.designer.api.invalid_request_format=cause=bad request provided.,action=Verify the request payload.
+org.onap.ccsdk.cds.blueprintsprocessor.designer.api.unauthorized_request=cause=The request requires user authentication.,action=Please provide the right credentials.
+org.onap.ccsdk.cds.blueprintsprocessor.designer.api.request_not_found=cause=Request mapping doesn't exist.,action=Please verify your request.
+org.onap.ccsdk.cds.blueprintsprocessor.designer.api.conflict_adding_resource=cause=Duplicated entry while saving resource.,action=Please make the saving model doesn't exist.
+org.onap.ccsdk.cds.blueprintsprocessor.designer.api.duplicate_data=cause=Duplicated data - was expecting one result, got more than one.,action=Please provide single resource at a time.
+org.onap.ccsdk.cds.blueprintsprocessor.designer.api.resource_not_found=cause=No response was found for this request in the server.,action=Provide the ID to find the resource.
+org.onap.ccsdk.cds.blueprintsprocessor.designer.api.unsupported_media_type=cause=An invalid media was provided.,action=Please make sure your media or artifact is in the proper structure or format.
+
+# Resource API
+org.onap.ccsdk.cds.blueprintsprocessor.resource.api.generic_failure=cause=Internal error while processing REST call to the Resource API.,action=Verify the request and try again.
+org.onap.ccsdk.cds.blueprintsprocessor.resource.api.invalid_file_extension=cause=Failed trying to upload a non ZIP file format.,action=Please reload your file and make sure it is in ZIP format.
+org.onap.ccsdk.cds.blueprintsprocessor.resource.api.resource_path_missing=cause=Resource path missing or wrong.,action=Please reload your artifact in run time.
+org.onap.ccsdk.cds.blueprintsprocessor.resource.api.resource_writing_fail=cause=Fail to write resources files.,action=Please reload your files and make sure it is in the right format.
+org.onap.ccsdk.cds.blueprintsprocessor.resource.api.io_file_interrupt=cause=IO file system interruption.,action=Please reload your file and make sure it is in the right format.
+org.onap.ccsdk.cds.blueprintsprocessor.resource.api.invalid_request_format=cause=bad request provided.,action=Verify the request payload.
+org.onap.ccsdk.cds.blueprintsprocessor.resource.api.unauthorized_request=cause=The request requires user authentication.,action=Please provide the right credentials.
+org.onap.ccsdk.cds.blueprintsprocessor.resource.api.request_not_found=cause=Request mapping doesn't exist.,action=Please verify your request.
+org.onap.ccsdk.cds.blueprintsprocessor.resource.api.conflict_adding_resource=cause=Duplicated entry while saving resource.,action=Please make the saving model doesn't exist.
+org.onap.ccsdk.cds.blueprintsprocessor.resource.api.duplicate_data=cause=Duplicated data - was expecting one result, got more than one.,action=Please provide single resource at a time.
+org.onap.ccsdk.cds.blueprintsprocessor.resource.api.resource_not_found=cause=No response was found for this request in the server.,action=Provide the ID to find the resource.
+org.onap.ccsdk.cds.blueprintsprocessor.resource.api.unsupported_media_type=cause=An invalid media was provided.,action=Please make sure your media or artifact is in the proper structure or format.
+
+# Configs API
+org.onap.ccsdk.cds.blueprintsprocessor.configs.api.generic_failure=cause=Internal error while processing REST call to the Configs API.,action=Verify the request and try again.
+org.onap.ccsdk.cds.blueprintsprocessor.configs.api.resource_path_missing=cause=Resource path missing or wrong.,action=Please reload your artifact in run time.
+org.onap.ccsdk.cds.blueprintsprocessor.configs.api.io_file_interrupt=cause=IO file system interruption.,action=Please reload your file and make sure it is in the right format.
+org.onap.ccsdk.cds.blueprintsprocessor.configs.api.invalid_request_format=cause=bad request provided.,action=Verify the request payload.
+org.onap.ccsdk.cds.blueprintsprocessor.configs.api.unauthorized_request=cause=The request requires user authentication.,action=Please provide the right credentials.
+org.onap.ccsdk.cds.blueprintsprocessor.configs.api.request_not_found=cause=Request mapping doesn't exist.,action=Please verify your request.
+org.onap.ccsdk.cds.blueprintsprocessor.configs.api.conflict_adding_resource=cause=Duplicated entry while saving resource.,action=Please make the saving model doesn't exist.
+org.onap.ccsdk.cds.blueprintsprocessor.configs.api.duplicate_data=cause=Duplicated data - was expecting one result, got more than one.,action=Please provide single resource at a time.
+org.onap.ccsdk.cds.blueprintsprocessor.configs.api.resource_not_found=cause=No response was found for this request in the server.,action=Provide the ID to find the resource.
+
+# Python Executor
+org.onap.ccsdk.cds.blueprintsprocessor.functions.python.executor.generic_failure=cause=Internal error in Blueprint Processor run time.,action=Contact CDS administrator team.
+
+# Resource resolution
+org.onap.ccsdk.cds.blueprintsprocessor.resource.resolution.invalid_request_format=cause=bad request provided.,action=Verify the request payload.
+org.onap.ccsdk.cds.blueprintsprocessor.resource.resolution.resource_not_found=cause=No response was found for this resolution in CDS.,action=Verify definition of the resource in CBA.
+org.onap.ccsdk.cds.blueprintsprocessor.resource.resolution.internal_error=cause=Internal error while processing Resource Resolution.,action=Verify the payload.
+
+org.onap.ccsdk.cds.sdclistener.generic_failure=cause=Internal error in SDC Listener.,action=Contact CDS administrator team. \ No newline at end of file
diff --git a/plans/usecases-config-over-netconf/config-over-netconf/cds/resources/importCerAndStartService.sh b/plans/usecases-config-over-netconf/config-over-netconf/cds/resources/importCerAndStartService.sh
new file mode 100755
index 00000000..b5816068
--- /dev/null
+++ b/plans/usecases-config-over-netconf/config-over-netconf/cds/resources/importCerAndStartService.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+chmod -R 775 /opt/app/onap/res
+cp -f /opt/app/onap/res/application.properties /opt/app/onap/config
+cp -f /opt/app/onap/res/error-messages_en.properties /opt/app/onap/config
+
+echo "Starting Service..."
+source /startService.sh \ No newline at end of file
diff --git a/plans/usecases-config-over-netconf/config-over-netconf/netconf-pnp-simulator/docker-compose.yml b/plans/usecases-config-over-netconf/config-over-netconf/netconf-pnp-simulator/docker-compose.yml
new file mode 100755
index 00000000..d8e723ba
--- /dev/null
+++ b/plans/usecases-config-over-netconf/config-over-netconf/netconf-pnp-simulator/docker-compose.yml
@@ -0,0 +1,12 @@
+version: '3'
+
+services:
+ netconf-pnp-simulator:
+ image: nexus3.onap.org:10001/onap/integration/simulators/netconf-pnp-simulator:2.8.6
+ container_name: netconf-simulator
+ restart: always
+ ports:
+ - "830:830"
+ - "6513:6513"
+ volumes:
+ - ${NETCONF_CONFIG_PATH}:/config/modules/mynetconf
diff --git a/plans/usecases-config-over-netconf/config-over-netconf/netconf-pnp-simulator/netconf-config/data.json b/plans/usecases-config-over-netconf/config-over-netconf/netconf-pnp-simulator/netconf-config/data.json
new file mode 100644
index 00000000..63872eef
--- /dev/null
+++ b/plans/usecases-config-over-netconf/config-over-netconf/netconf-pnp-simulator/netconf-config/data.json
@@ -0,0 +1,10 @@
+{
+ "mynetconf:netconflist": {
+ "netconf": [
+ {
+ "netconf-id": 3,
+ "netconf-param": 3
+ }
+ ]
+ }
+}
diff --git a/plans/usecases-config-over-netconf/config-over-netconf/netconf-pnp-simulator/netconf-config/model.yang b/plans/usecases-config-over-netconf/config-over-netconf/netconf-pnp-simulator/netconf-config/model.yang
new file mode 100644
index 00000000..6c8c36ab
--- /dev/null
+++ b/plans/usecases-config-over-netconf/config-over-netconf/netconf-pnp-simulator/netconf-config/model.yang
@@ -0,0 +1,29 @@
+module mynetconf {
+ yang-version 1.1;
+ namespace "urn:mynetconf:test";
+
+ prefix nft;
+
+ organization
+ "mynetconf";
+ contact
+ "my netconf address";
+ description
+ "yang model for mynetconf";
+ revision "2019-03-01" {
+ description
+ "initial version";
+ }
+
+ container netconflist {
+ list netconf {
+ key netconf-id;
+ leaf netconf-id {
+ type uint16;
+ }
+ leaf netconf-param {
+ type uint32;
+ }
+ }
+ }
+}
diff --git a/plans/usecases-config-over-netconf/config-over-netconf/netconf-pnp-simulator/netconf-config/subscriber.py b/plans/usecases-config-over-netconf/config-over-netconf/netconf-pnp-simulator/netconf-config/subscriber.py
new file mode 100755
index 00000000..61272967
--- /dev/null
+++ b/plans/usecases-config-over-netconf/config-over-netconf/netconf-pnp-simulator/netconf-config/subscriber.py
@@ -0,0 +1,136 @@
+#!/usr/bin/env python3
+
+__author__ = "Mislav Novakovic <mislav.novakovic@sartura.hr>"
+__copyright__ = "Copyright 2018, Deutsche Telekom AG"
+__license__ = "Apache 2.0"
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This sample application demonstrates use of Python programming language bindings for sysrepo library.
+# Original c application was rewritten in Python to show similarities and differences
+# between the two.
+#
+# Most notable difference is in the very different nature of languages, c is weakly statically typed language
+# while Python is strongly dynamically typed. Python code is much easier to read and logic easier to comprehend
+# for smaller scripts. Memory safety is not an issue but lower performance can be expected.
+#
+# The original c implementation is also available in the source, so one can refer to it to evaluate trade-offs.
+
+import sysrepo as sr
+import sys
+
+
+# Helper function for printing changes given operation, old and new value.
+def print_change(op, old_val, new_val):
+ if op == sr.SR_OP_CREATED:
+ print(f"CREATED: {new_val.to_string()}")
+ elif op == sr.SR_OP_DELETED:
+ print(f"DELETED: {old_val.to_string()}")
+ elif op == sr.SR_OP_MODIFIED:
+ print(f"MODIFIED: {old_val.to_string()} to {new_val.to_string()}")
+ elif op == sr.SR_OP_MOVED:
+ print(f"MOVED: {new_val.xpath()} after {old_val.xpath()}")
+
+
+# Helper function for printing events.
+def ev_to_str(ev):
+ if ev == sr.SR_EV_VERIFY:
+ return "verify"
+ elif ev == sr.SR_EV_APPLY:
+ return "apply"
+ elif ev == sr.SR_EV_ABORT:
+ return "abort"
+ else:
+ return "unknown"
+
+
+# Function to print current configuration state.
+# It does so by loading all the items of a session and printing them out.
+def print_current_config(session, module_name):
+ select_xpath = f"/{module_name}:*//*"
+
+ values = session.get_items(select_xpath)
+
+ if values is not None:
+ print("========== BEGIN CONFIG ==========")
+ for i in range(values.val_cnt()):
+ print(values.val(i).to_string(), end='')
+ print("=========== END CONFIG ===========")
+
+
+# Function to be called for subscribed client of given session whenever configuration changes.
+def module_change_cb(sess, module_name, event, private_ctx):
+ try:
+ print("========== Notification " + ev_to_str(event) + " =============================================")
+ if event == sr.SR_EV_APPLY:
+ print_current_config(sess, module_name)
+
+ print("========== CHANGES: =============================================")
+
+ change_path = f"/{module_name}:*"
+
+ it = sess.get_changes_iter(change_path)
+
+ while True:
+ change = sess.get_change_next(it)
+ if change is None:
+ break
+ print_change(change.oper(), change.old_val(), change.new_val())
+
+ print("========== END OF CHANGES =======================================")
+ except Exception as e:
+ print(e)
+
+ return sr.SR_ERR_OK
+
+
+def main():
+ # Notable difference between c implementation is using exception mechanism for open handling unexpected events.
+ # Here it is useful because `Connection`, `Session` and `Subscribe` could throw an exception.
+ try:
+ module_name = "ietf-interfaces"
+ if len(sys.argv) > 1:
+ module_name = sys.argv[1]
+ else:
+ print("\nYou can pass the module name to be subscribed as the first argument")
+
+ print(f"Application will watch for changes in {module_name}")
+
+ # connect to sysrepo
+ conn = sr.Connection(module_name)
+
+ # start session
+ sess = sr.Session(conn)
+
+ # subscribe for changes in running config */
+ subscribe = sr.Subscribe(sess)
+
+ subscribe.module_change_subscribe(module_name, module_change_cb)
+
+ try:
+ print_current_config(sess, module_name)
+ except Exception as e:
+ print(e)
+
+ print("========== STARTUP CONFIG APPLIED AS RUNNING ==========")
+
+ sr.global_loop()
+
+ print("Application exit requested, exiting.")
+
+ except Exception as e:
+ print(e)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/plans/usecases-config-over-netconf/config-over-netconf/setup.sh b/plans/usecases-config-over-netconf/config-over-netconf/setup.sh
index fcedbecf..2e61da0a 100644
--- a/plans/usecases-config-over-netconf/config-over-netconf/setup.sh
+++ b/plans/usecases-config-over-netconf/config-over-netconf/setup.sh
@@ -20,101 +20,102 @@
# @author Rahul Tyagi (rahul.tyagi@est.tech)
-
-SCRIPTS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
-export PARENT=usecases-config-over-netconf
-export SUB_PARENT=config-over-netconf
-source ${WORKSPACE}/plans/$PARENT/$SUB_PARENT/test.properties
+SCRIPTS="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+source "${WORKSPACE}"/plans/usecases-config-over-netconf/config-over-netconf/test.properties
export MTU=$(/sbin/ifconfig | grep MTU | sed 's/.*MTU://' | sed 's/ .*//' | sort -n | head -1)
if [ "$MTU" == "" ]; then
- export MTU="1450"
+ export MTU="1450"
fi
-# clone integration branch for pnf-simulator
-mkdir -m 755 -p $WORKSPACE/temp/integration
-cd $WORKSPACE/temp
-git clone -b dublin --single-branch --depth=1 http://gerrit.onap.org/r/integration.git integration
-
-HOST_IP_ADDR=localhost
+export CONFIG_OVER_NETCONF=${CONFIG_OVER_NETCONF}
-# setup sdnc
+# Prepare enviroment
+echo "Uninstall docker-py and reinstall docker."
+pip uninstall -y docker-py
+pip uninstall -y docker
+pip install -U docker==2.7.0
-cd $SDNC_DOCKER_PATH
+# Disable Proxy - for local run
unset http_proxy https_proxy
-docker pull $NETOPEER_DOCKER_REPO:$NETOPEER_IMAGE_TAG
-docker tag $NETOPEER_DOCKER_REPO:$NETOPEER_IMAGE_TAG $NETOPEER_DOCKER_REPO:latest
-#sed -i "s/DMAAP_TOPIC_ENV=.*/DMAAP_TOPIC_ENV="AUTO"/g" diocker-compose.yml
-docker login -u $NEXUS_USERNAME -p $NEXUS_PASSWD $NEXUS_DOCKER_REPO
+# Export default Networking bridge created on the host machine
+export LOCAL_IP=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')
-docker pull $NEXUS_DOCKER_REPO/onap/sdnc-image:$SDNC_IMAGE_TAG
-docker tag $NEXUS_DOCKER_REPO/onap/sdnc-image:$SDNC_IMAGE_TAG onap/sdnc-image:latest
+###################### Netconf-PNP-Simulator Setup ######################
-docker pull $NEXUS_DOCKER_REPO/onap/sdnc-ansible-server-image:$ANSIBLE_IMAGE_TAG
-docker tag $NEXUS_DOCKER_REPO/onap/sdnc-ansible-server-image:$ANSIBLE_IMAGE_TAG onap/sdnc-ansible-server-image:latest
+# Export Netconf-Pnp Simulator conf path
+export NETCONF_CONFIG_PATH
-docker pull $NEXUS_DOCKER_REPO/onap/ccsdk-blueprintsprocessor:$BP_IMAGE_TAG
-docker tag $NEXUS_DOCKER_REPO/onap/ccsdk-blueprintsprocessor:$BP_IMAGE_TAG onap/ccsdk-blueprintsprocessor:latest
+# Start N etconf-Pnp-Simulator Container with docker-compose and configuration from docker-compose.yml
+docker-compose -f "${CONFIG_OVER_NETCONF}"/netconf-pnp-simulator/docker-compose.yml up -d
-export SDNC_CERT_PATH=${CERT_SUBPATH}
-#sed -i 's/sdnc_controller_container/sdnc_controller_container\n volumes: \n - $SDNC_CERT_PATH:\/opt\/opendaylight\/current\/certs/' docker-compose.yaml
-# start SDNC containers with docker compose and configuration from docker-compose.yml
-docker-compose up -d
+# Update default Networking bridge IP in mount.json file
+sed -i "s/pnfaddr/${LOCAL_IP}/g" "${REQUEST_DATA_PATH}"/mount.xml
-# start pnf simulator
+############################## SDNC Setup ##############################
-cd $INT_DOCKER_PATH
+export SDNC_CERT_PATH="${CERT_SUBPATH}"
-./simulator.sh start&
+docker pull "${NEXUS_DOCKER_REPO}"/onap/sdnc-image:"${SDNC_IMAGE_TAG}"
+docker tag "${NEXUS_DOCKER_REPO}"/onap/sdnc-image:"${SDNC_IMAGE_TAG}" onap/sdnc-image:latest
-# WAIT 10 minutes maximum and test every 5 seconds if SDNC is up using HealthCheck API
-TIME_OUT=1000
-INTERVAL=30
-TIME=0
-while [ "$TIME" -lt "$TIME_OUT" ]; do
- response=$(curl --write-out '%{http_code}' --silent --output /dev/null -H "Authorization: Basic YWRtaW46S3A4Yko0U1hzek0wV1hsaGFrM2VIbGNzZTJnQXc4NHZhb0dHbUp2VXkyVQ==" -X POST -H "X-FromAppId: csit-sdnc" -H "X-TransactionId: csit-sdnc" -H "Accept: application/json" -H "Content-Type: application/json" http://localhost:8282/restconf/operations/SLI-API:healthcheck );
- echo $response
+docker pull "${NEXUS_DOCKER_REPO}"/onap/sdnc-ansible-server-image:"${ANSIBLE_IMAGE_TAG}"
+docker tag "${NEXUS_DOCKER_REPO}"/onap/sdnc-ansible-server-image:"${ANSIBLE_IMAGE_TAG}" onap/sdnc-ansible-server-image:latest
- if [ "$response" == "200" ]; then
- echo SDNC started in $TIME seconds
- break;
- fi
+docker-compose -f "${CONFIG_OVER_NETCONF}"/sdn/docker-compose.yaml up -d
- echo Sleep: $INTERVAL seconds before testing if SDNC is up. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
- sleep $INTERVAL
- TIME=$(($TIME+$INTERVAL))
+# Check if SDNC Service is healthy and ready
+for i in {1..10}; do
+ SDNC_IP=$(get-instance-ip.sh sdnc_controller_container)
+ RESP_CODE=$(curl --write-out '%{http_code}' --silent --output /dev/null -H "Authorization: Basic YWRtaW46S3A4Yko0U1hzek0wV1hsaGFrM2VIbGNzZTJnQXc4NHZhb0dHbUp2VXkyVQ==" -X POST -H "X-FromAppId: csit-sdnc" -H "X-TransactionId: csit-sdnc" -H "Accept: application/json" -H "Content-Type: application/json" http://localhost:8282/restconf/operations/SLI-API:healthcheck)
+ if [[ "${RESP_CODE}" == '200' ]]; then
+ echo "SDNC Service is Ready."
+ break
+ fi
+ echo "Waiting for SDNC Service to Start Up..."
+ sleep 2m
done
-export LOCAL_IP=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')
-sed -i "s/pnfaddr/$LOCAL_IP/g" $REQUEST_DATA_PATH/mount.xml
+if [[ "${SDNC_IP}" == 'none' || "${SDNC_IP}" == '' || "${RESP_CODE}" != '200' ]]; then
+ echo "SDNC Service not started Could cause problems for testing activities...!"
+fi
+############################## CDS Setup ##############################
-if [ "$TIME" -ge "$TIME_OUT" ]; then
- echo TIME OUT: karaf session not started in $TIME_OUT seconds... Could cause problems for testing activities...
-fi
+docker pull "${NEXUS_DOCKER_REPO}"/onap/ccsdk-blueprintsprocessor:"${BP_IMAGE_TAG}"
+docker tag "${NEXUS_DOCKER_REPO}"/onap/ccsdk-blueprintsprocessor:"${BP_IMAGE_TAG}" onap/ccsdk-blueprintsprocessor:latest
-########################################## blueprintsprocessor setup ##########################################################
-source $CDS_DOCKER_PATH/cds_setup.sh
+docker-compose -f "${CONFIG_OVER_NETCONF}"/cds/docker-compose.yaml up -d
-########## update pnf simulator ip in config deploy request ########
+echo "Sleeping 1 minute"
+sleep 1m
-NETOPEER_CONTAINER=$(docker ps -a -q --filter="name=netopeer")
-NETOPEER_CONTAINER_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $SDNC_CONTAINER)
-RES_KEY=$(uuidgen -r)
-sed -i "s/pnfaddr/$LOCAL_IP/g" $REQUEST_DATA_PATH/config-deploy.json
-sed -i "s/pnfaddr/$LOCAL_IP/g" $REQUEST_DATA_PATH/config-assign.json
+BP_CONTAINER=$(docker ps -a -q --filter="name=bp-rest")
+CCSDK_MARIADB=$(docker ps -a -q --filter="name=ccsdk-mariadb")
-sed -i "s/reskey/$RES_KEY/g" $REQUEST_DATA_PATH/config-deploy.json
-sed -i "s/reskey/$RES_KEY/g" $REQUEST_DATA_PATH/config-assign.json
+for i in {1..10}; do
+ if [ $(docker inspect --format='{{ .State.Running }}' "${BP_CONTAINER}") ] &&
+ [ $(docker inspect --format='{{ .State.Running }}' "${CCSDK_MARIADB}") ]; then
+ echo "Blueprint Proc Service Running"
+ break
+ else
+ echo sleep "${i}"
+ sleep "${i}"
+ fi
+done
-#########################check if server is up gracefully ######################################
+############################ Update Setup ############################
-# Sleep additional 3 minutes (180 secs) to give application time to finish
+RES_KEY=$(uuidgen -r)
+sed -i "s/pnfaddr/$LOCAL_IP/g" "${REQUEST_DATA_PATH}"/config-deploy.json
+sed -i "s/pnfaddr/$LOCAL_IP/g" "${REQUEST_DATA_PATH}"/config-assign.json
-sleep 150
+sed -i "s/reskey/$RES_KEY/g" "${REQUEST_DATA_PATH}"/config-deploy.json
+sed -i "s/reskey/$RES_KEY/g" "${REQUEST_DATA_PATH}"/config-assign.json
# Pass any variables required by Robot test suites in ROBOT_VARIABLES
-
-ROBOT_VARIABLES="-v SCRIPTS:${SCRIPTS}"
+REPO_IP='127.0.0.1'
+ROBOT_VARIABLES+=" -v REPO_IP:${REPO_IP} "
+ROBOT_VARIABLES+=" -v SCRIPTS:${SCRIPTS} " \ No newline at end of file
diff --git a/plans/usecases-config-over-netconf/config-over-netconf/teardown.sh b/plans/usecases-config-over-netconf/config-over-netconf/teardown.sh
index 9613e3ee..7257b366 100755
--- a/plans/usecases-config-over-netconf/config-over-netconf/teardown.sh
+++ b/plans/usecases-config-over-netconf/config-over-netconf/teardown.sh
@@ -1,18 +1,10 @@
#!/bin/bash
-SDNC_DOCKER_COMPOSE_PATH=$SDNC_DOCKER_PATH/docker-compose.yaml
-PNFSIM_DOCKER_COMPOSE_PATH=$INT_DOCKER_PATH/docker-compose.yml
-CDS_DOCKER_COMPOSE_PATH=$CDS_DOCKER_PATH/docker-compose.yaml
+echo 'Stop, Removing all running containers...'
+docker stop $(docker ps -aq) && docker rm $(docker ps -aq)
-echo "==========================blueprint-processor logs =================================="
-docker logs bp-rest
+echo 'Removing Volumes...'
+echo y | docker volume prune
-echo "==========================sdnc-controller logs ======================================"
-docker logs sdnc_controller_container
-
-
-docker-compose -f $SDNC_DOCKER_COMPOSE_PATH down
-docker-compose -f $PNFSIM_DOCKER_COMPOSE_PATH down
-docker-compose -f $CDS_DOCKER_COMPOSE_PATH down
-
-rm -rf $WORKSPACE/temp
+echo 'Removing Networks...'
+echo y | docker network prune \ No newline at end of file
diff --git a/plans/usecases-config-over-netconf/config-over-netconf/test.properties b/plans/usecases-config-over-netconf/config-over-netconf/test.properties
index ee002461..4e4c99b4 100644
--- a/plans/usecases-config-over-netconf/config-over-netconf/test.properties
+++ b/plans/usecases-config-over-netconf/config-over-netconf/test.properties
@@ -1,14 +1,10 @@
NEXUS_DOCKER_REPO=nexus3.onap.org:10001
NEXUS_USERNAME=docker
NEXUS_PASSWD=docker
+BP_IMAGE_TAG=0.7.1
SDNC_IMAGE_TAG=1.7.6
ANSIBLE_IMAGE_TAG=1.7.6
-BP_IMAGE_TAG=0.6.4
-REQUEST_DATA_PATH=$WORKSPACE/tests/$PARENT/$SUB_PARENT/data
-TC_PLANS_PATH=$WORKSPACE/plans/$PARENT/$SUB_PARENT
-CDS_DOCKER_PATH=$TC_PLANS_PATH/cds
-SDNC_DOCKER_PATH=$TC_PLANS_PATH/sdn
-INT_DOCKER_PATH=$WORKSPACE/temp/integration/test/mocks/pnfsimulator
-CERT_SUBPATH=$TC_PLANS_PATH/certs
-NETOPEER_DOCKER_REPO=sysrepo/sysrepo-netopeer2
-NETOPEER_IMAGE_TAG=v0.7.7
+CERT_SUBPATH=${WORKSPACE}/plans/usecases-config-over-netconf/config-over-netconf/certs
+CONFIG_OVER_NETCONF=${WORKSPACE}/plans/usecases-config-over-netconf/config-over-netconf
+REQUEST_DATA_PATH=${WORKSPACE}/tests/usecases-config-over-netconf/config-over-netconf/data
+NETCONF_CONFIG_PATH=${WORKSPACE}/plans/usecases-config-over-netconf/config-over-netconf/netconf-pnp-simulator/netconf-config \ No newline at end of file