summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generic-resource-api/features/src/main/resources/features.xml2
-rw-r--r--generic-resource-api/model/src/main/yang/GENERIC-RESOURCE-API.yang170
-rw-r--r--generic-resource-api/provider/pom.xml13
-rw-r--r--generic-resource-api/provider/src/main/java/org/onap/sdnc/northbound/GenericResourceApiProvider.java362
-rw-r--r--generic-resource-api/provider/src/main/java/org/onap/sdnc/northbound/GenericResourceApiUtil.java4
-rw-r--r--generic-resource-api/provider/src/test/java/org/onap/sdnc/northbound/TestGenericResourceApi.java129
-rw-r--r--vnfapi/features/src/main/resources/features.xml2
-rw-r--r--vnfapi/provider/src/main/java/org/onap/sdnc/vnfapi/VnfSdnUtil.java14
8 files changed, 662 insertions, 34 deletions
diff --git a/generic-resource-api/features/src/main/resources/features.xml b/generic-resource-api/features/src/main/resources/features.xml
index ac7a1d06..ccf60324 100644
--- a/generic-resource-api/features/src/main/resources/features.xml
+++ b/generic-resource-api/features/src/main/resources/features.xml
@@ -6,7 +6,7 @@
<feature name='GENERIC-RESOURCE-API' description="generic-resource-api.GENERIC-RESOURCE-API" version='${project.version}'>
<feature version="${odl.controller.mdsal.version}">odl-mdsal-broker</feature>
- <feature version="${sdnctl.sli.version}">sdnc-sli</feature>
+ <feature>sdnc-sli</feature>
<!-- It is assumed that applications are installed on BVC, which installs bvc-core including MD-SAL etc.
Do not list those features out here as that will tie your implementation to a specific version
of MD-SAL / BVC and force updates to your application for every upgrade of BVC core platform.-->
diff --git a/generic-resource-api/model/src/main/yang/GENERIC-RESOURCE-API.yang b/generic-resource-api/model/src/main/yang/GENERIC-RESOURCE-API.yang
index 233fbaf8..4340ae40 100644
--- a/generic-resource-api/model/src/main/yang/GENERIC-RESOURCE-API.yang
+++ b/generic-resource-api/model/src/main/yang/GENERIC-RESOURCE-API.yang
@@ -160,7 +160,7 @@ module GENERIC-RESOURCE-API {
grouping service-topology {
container service-topology {
uses service-topology-identifier;
- uses ecomp-model-information;
+ uses onap-model-information;
uses service-assignments;
uses service-parameters;
}
@@ -225,7 +225,7 @@ module GENERIC-RESOURCE-API {
leaf network-type {
type string;
}
- uses ecomp-model-information;
+ uses onap-model-information;
}
}
grouping network-request-input {
@@ -243,7 +243,7 @@ module GENERIC-RESOURCE-API {
container network-topology {
uses network-topology-identifier-structure;
uses region-identifier;
- uses ecomp-model-information;
+ uses onap-model-information;
uses network-assignments;
uses network-parameters;
}
@@ -313,7 +313,7 @@ module GENERIC-RESOURCE-API {
description "vnf-model-id in Pats model?in Pats vnf submodule, contained within vnf-instance-topology-identifier grouping (along with vnf-name and vnf-instance-id)";
type string;
}
- uses ecomp-model-information;
+ uses onap-model-information;
}
}
grouping vnf-request-input {
@@ -342,7 +342,7 @@ module GENERIC-RESOURCE-API {
container vnf-topology {
uses vnf-topology-identifier-structure;
uses region-identifier;
- uses ecomp-model-information;
+ uses onap-model-information;
uses vnf-resource-assignments;
container vnf-parameters-data {
uses param;
@@ -458,7 +458,7 @@ module GENERIC-RESOURCE-API {
leaf vf-module-type {
type string;
}
- uses ecomp-model-information;
+ uses onap-model-information;
}
}
grouping vf-module-request-input {
@@ -480,7 +480,7 @@ module GENERIC-RESOURCE-API {
container vf-module-topology {
uses vf-module-topology-identifier;
uses region-identifier;
- uses ecomp-model-information;
+ uses onap-model-information;
uses vf-module-assignments;
container vf-module-parameters {
uses param;
@@ -691,7 +691,7 @@ module GENERIC-RESOURCE-API {
grouping contrail-route-topology {
container contrail-route-topology {
uses allotted-resource-identifiers;
- uses ecomp-model-information;
+ uses onap-model-information;
uses contrail-route-assignments;
container contrail-route-parameters {
uses param;
@@ -762,7 +762,7 @@ module GENERIC-RESOURCE-API {
grouping security-zone-topology {
container security-zone-topology {
uses allotted-resource-identifiers;
- uses ecomp-model-information;
+ uses onap-model-information;
uses security-zone-assignments;
container security-zone-parameters {
uses param;
@@ -798,6 +798,75 @@ module GENERIC-RESOURCE-API {
}
}
}
+ grouping tunnelxconn-operation-information {
+ uses sdnc-request-header;
+ uses request-information;
+ uses service-information;
+ uses allotted-resource-information;
+ uses tunnelxconn-request-input;
+ }
+ grouping tunnelxconn-request-input {
+ leaf brg-wan-mac-address {
+ type string;
+ }
+ }
+ grouping tunnelxconn-topology {
+ container tunnelxconn-topology {
+ uses allotted-resource-identifiers;
+ uses onap-model-information;
+ uses tunnelxconn-assignments;
+ container tunnelxconn-parameters {
+ uses param;
+ }
+ }
+ }
+ grouping tunnelxconn-assignments {
+ leaf vni {
+ description "The Network Controller will assign a VNI value from the associated vGMUX VNI pool";
+ type string;
+ }
+ leaf vgmux-bearer-ip {
+ description "The Network Controller will look up the vgmux bearer ip from the vgmux vf module";
+ type inet:ip-address;
+ }
+ leaf vgmux-lan-up {
+ description "The Network Controller will look up the vgmux lan ip from the vgmux vg module";
+ type inet:ip-address;
+ }
+ }
+ grouping brg-operation-information {
+ uses sdnc-request-header;
+ uses request-information;
+ uses service-information;
+ uses allotted-resource-information;
+ uses brg-request-input;
+ }
+ grouping brg-request-input {
+ leaf vgmux-bearer-ip {
+ type inet:ip-address;
+ }
+ leaf vni {
+ type string;
+ }
+ leaf brg-wan-ip-address {
+ type inet:ip-address;
+ }
+ }
+ grouping brg-topology {
+ container brg-topology {
+ uses allotted-resource-identifiers;
+ uses onap-model-information;
+ uses brg-assignments;
+ container brg-parameters {
+ uses param;
+ }
+ }
+ }
+ grouping brg-assignments {
+ leaf vbrg-wan-ip {
+ type inet:ip-address;
+ }
+ }
grouping allotted-resource-information {
container allotted-resource-information {
leaf allotted-resource-id {
@@ -811,7 +880,7 @@ module GENERIC-RESOURCE-API {
description "Service-instance-id of the parent service to which this allotted resource belongs.";
type string;
}
- uses ecomp-model-information;
+ uses onap-model-information;
}
}
grouping allotted-resource-identifiers {
@@ -978,7 +1047,7 @@ module GENERIC-RESOURCE-API {
description "used to reference a&ai subscription-service-type. For example, we show as vIPR-ATM in example.";
type string;
}
- uses ecomp-model-information;
+ uses onap-model-information;
leaf service-instance-id {
type string;
}
@@ -992,8 +1061,8 @@ module GENERIC-RESOURCE-API {
}
}
}
- grouping ecomp-model-information {
- container ecomp-model-information {
+ grouping onap-model-information {
+ container onap-model-information {
leaf model-invariant-uuid {
description "identifies the invariant uuid for this service or resource";
type string;
@@ -1144,6 +1213,16 @@ module GENERIC-RESOURCE-API {
uses instance-reference;
}
}
+ grouping tunnelxconn-response-information {
+ container tunnelxconn-response-information {
+ uses instance-reference;
+ }
+ }
+ grouping brg-response-information {
+ container brg-response-information {
+ uses instance-reference;
+ }
+ }
grouping preload-model-information {
list vnf-preload-list {
key "vnf-name vnf-type";
@@ -1229,7 +1308,7 @@ module GENERIC-RESOURCE-API {
}
}
list vnf-networks {
- key "";
+ key "network-role";
uses vnf-network;
uses sriov-vlan-filter-list;
}
@@ -1253,7 +1332,7 @@ module GENERIC-RESOURCE-API {
}
}
list vm-networks {
- key "";
+ key "network-role";
uses vm-network;
}
}
@@ -1584,6 +1663,46 @@ module GENERIC-RESOURCE-API {
uses allotted-resource-status;
}
}
+ container tunnelxconn-allotted-resources {
+ list tunnelxconn-allotted-resource {
+ key "allotted-resource-id";
+ leaf allotted-resource-id {
+ type string;
+ mandatory true;
+ }
+ container allotted-resource-data {
+ container allotted-resource-operation-information {
+ uses tunnelxconn-operation-information;
+ }
+ uses tunnelxconn-topology;
+ container tunnelxconn-parameters {
+ uses param;
+ }
+ uses allotted-resource-oper-status;
+ }
+ uses allotted-resource-status;
+ }
+ }
+ container brg-allotted-respources {
+ list brg-allotted-resource {
+ key "allotted-resource-id";
+ leaf allotted-resource-id {
+ type string;
+ mandatory true;
+ }
+ container allotted-resource-data {
+ container allotted-resource-operation-information {
+ uses brg-operation-information;
+ }
+ uses brg-topology;
+ container brg-parameters {
+ uses param;
+ }
+ uses allotted-resource-oper-status;
+ }
+ uses allotted-resource-status;
+ }
+ }
rpc service-topology-operation {
input {
uses service-operation-information;
@@ -1644,6 +1763,26 @@ module GENERIC-RESOURCE-API {
uses service-response-information;
}
}
+ rpc tunnelxconn-topology-operation {
+ input {
+ uses tunnelxconn-operation-information;
+ }
+ output {
+ uses topology-response-common;
+ uses tunnelxconn-response-information;
+ uses service-response-information;
+ }
+ }
+ rpc brg-topology-operation {
+ input {
+ uses brg-operation-information;
+ }
+ output {
+ uses topology-response-common;
+ uses brg-response-information;
+ uses service-response-information;
+ }
+ }
container preload-vnfs {
uses preload-model-information;
}
@@ -1667,4 +1806,5 @@ module GENERIC-RESOURCE-API {
uses vnf-topology-response-body;
}
}
+
} ////closes the module
diff --git a/generic-resource-api/provider/pom.xml b/generic-resource-api/provider/pom.xml
index c3f61c97..2f4a25fb 100644
--- a/generic-resource-api/provider/pom.xml
+++ b/generic-resource-api/provider/pom.xml
@@ -37,7 +37,6 @@
<version>${odl.mdsal.version}</version>
</dependency>
- <!--
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>sal-test-model</artifactId>
@@ -60,12 +59,12 @@
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>sal-binding-broker-impl</artifactId>
- <version>${odl.mdsal.version}}</version>
+ <version>${odl.mdsal.version}</version>
<type>test-jar</type>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
- -->
+
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
@@ -85,7 +84,13 @@
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
- <version>3.8.1</version>
+ <version>${junit.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <version>${mockito.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
diff --git a/generic-resource-api/provider/src/main/java/org/onap/sdnc/northbound/GenericResourceApiProvider.java b/generic-resource-api/provider/src/main/java/org/onap/sdnc/northbound/GenericResourceApiProvider.java
index 0176aca4..a0b08621 100644
--- a/generic-resource-api/provider/src/main/java/org/onap/sdnc/northbound/GenericResourceApiProvider.java
+++ b/generic-resource-api/provider/src/main/java/org/onap/sdnc/northbound/GenericResourceApiProvider.java
@@ -19,6 +19,10 @@ import org.opendaylight.controller.md.sal.common.api.data.OptimisticLockFailedEx
import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.BrgTopologyOperationInput;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.BrgTopologyOperationInputBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.BrgTopologyOperationOutput;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.BrgTopologyOperationOutputBuilder;
import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationInput;
import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationInputBuilder;
import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationOutput;
@@ -48,6 +52,10 @@ import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.re
import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServiceTopologyOperationOutputBuilder;
import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.Services;
import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServicesBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.TunnelxconnTopologyOperationInput;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.TunnelxconnTopologyOperationInputBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.TunnelxconnTopologyOperationOutput;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.TunnelxconnTopologyOperationOutputBuilder;
import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VfModuleTopologyOperationInput;
import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VfModuleTopologyOperationInputBuilder;
import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VfModuleTopologyOperationOutput;
@@ -56,6 +64,7 @@ import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.re
import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfTopologyOperationInputBuilder;
import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfTopologyOperationOutput;
import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfTopologyOperationOutputBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.brg.response.information.BrgResponseInformationBuilder;
import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.contrail.route.response.information.ContrailRouteResponseInformationBuilder;
import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.network.response.information.NetworkResponseInformationBuilder;
import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.data.PreloadData;
@@ -76,6 +85,7 @@ import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.re
import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.status.ServiceStatus.RequestStatus;
import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.status.ServiceStatus.RpcAction;
import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.status.ServiceStatusBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.tunnelxconn.response.information.TunnelxconnResponseInformationBuilder;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
@@ -1698,6 +1708,356 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
return Futures.immediateFuture(rpcResult);
}
+ @Override
+ public Future<RpcResult<TunnelxconnTopologyOperationOutput>> tunnelxconnTopologyOperation(
+ TunnelxconnTopologyOperationInput input) {
+
+ final String SVC_OPERATION = "tunnelxconn-topology-operation";
+ ServiceData serviceData;
+ ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
+ Properties parms = new Properties();
+
+ log.info("{} called.", SVC_OPERATION);
+ // create a new response object
+ TunnelxconnTopologyOperationOutputBuilder responseBuilder = new TunnelxconnTopologyOperationOutputBuilder();
+
+ if(input == null ||
+ input.getServiceInformation() == null ||
+ input.getServiceInformation().getServiceInstanceId() == null ||
+ input.getServiceInformation().getServiceInstanceId().length() == 0)
+ {
+ log.debug("exiting {} because of null or empty service-instance-id", SVC_OPERATION);
+ responseBuilder.setResponseCode("404");
+ responseBuilder.setResponseMessage("invalid input, null or empty service-instance-id");
+ responseBuilder.setAckFinalIndicator("Y");
+ RpcResult<TunnelxconnTopologyOperationOutput> rpcResult =
+ RpcResultBuilder.<TunnelxconnTopologyOperationOutput> status(true).withResult(responseBuilder.build()).build();
+ return Futures.immediateFuture(rpcResult);
+ }
+
+ String siid = input.getServiceInformation().getServiceInstanceId();
+
+ // Get the service-instance service data from MD-SAL
+ ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
+ getServiceData(siid,serviceDataBuilder);
+
+ if (input.getSdncRequestHeader() != null) {
+ responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
+ }
+
+ ServiceData sd = serviceDataBuilder.build();
+ if (sd == null || sd.getServiceLevelOperStatus() == null)
+ {
+ log.debug("exiting {} because the service-instance does not have any service data in SDNC", SVC_OPERATION);
+ responseBuilder.setResponseCode("404");
+ responseBuilder.setResponseMessage("invalid input: the service-instance does not have any service data in SDNC");
+ responseBuilder.setAckFinalIndicator("Y");
+ RpcResult<TunnelxconnTopologyOperationOutput> rpcResult =
+ RpcResultBuilder.<TunnelxconnTopologyOperationOutput> status(true).withResult(responseBuilder.build()).build();
+ return Futures.immediateFuture(rpcResult);
+ }
+
+ log.info("Adding INPUT data for {} [{}] input: {}", SVC_OPERATION, siid, input);
+ TunnelxconnTopologyOperationInputBuilder inputBuilder = new TunnelxconnTopologyOperationInputBuilder(input);
+ GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
+
+ // Call SLI sync method
+ // Get SvcLogicService reference
+
+ GenericResourceApiSvcLogicServiceClient svcLogicClient = new GenericResourceApiSvcLogicServiceClient();
+ Properties respProps = null;
+
+ String errorCode = "200";
+ String errorMessage = null;
+ String ackFinal = "Y";
+ String allottedResourceId = "error";
+ String serviceObjectPath = null;
+ String tunnelxconnObjectPath = null;
+
+ try
+ {
+ if (svcLogicClient.hasGraph(appName, SVC_OPERATION , null, "sync"))
+ {
+
+ try
+ {
+ respProps = svcLogicClient.execute(appName, SVC_OPERATION, null, "sync", serviceDataBuilder, parms);
+ }
+ catch (Exception e)
+ {
+ log.error("Caught exception executing service logic for {}", SVC_OPERATION, e);
+ errorMessage = e.getMessage();
+ errorCode = "500";
+ }
+ } else {
+ errorMessage = "No service logic active for "+ appName +": '" + SVC_OPERATION + "'";
+ errorCode = "503";
+ }
+ }
+ catch (Exception e)
+ {
+ errorCode = "500";
+ errorMessage = e.getMessage();
+ log.error("Caught exception looking for service logic", e);
+ }
+
+
+ if (respProps != null)
+ {
+ errorCode = respProps.getProperty("error-code");
+ errorMessage = respProps.getProperty("error-message");
+ ackFinal = respProps.getProperty("ack-final", "Y");
+ allottedResourceId = respProps.getProperty("allotted-resource-id");
+ serviceObjectPath = respProps.getProperty("service-object-path");
+ tunnelxconnObjectPath = respProps.getProperty("tunnelxconn-object-path");
+ }
+
+ if ( errorCode != null && errorCode.length() != 0 && !( errorCode.equals("0")|| errorCode.equals("200"))) {
+ responseBuilder.setResponseCode(errorCode);
+ responseBuilder.setResponseMessage(errorMessage);
+ responseBuilder.setAckFinalIndicator(ackFinal);
+
+ log.error("Returned FAILED for {} [{}] {}", SVC_OPERATION, siid, responseBuilder.build());
+
+ RpcResult<TunnelxconnTopologyOperationOutput> rpcResult =
+ RpcResultBuilder.<TunnelxconnTopologyOperationOutput> status(true).withResult(responseBuilder.build()).build();
+ return Futures.immediateFuture(rpcResult);
+ }
+
+ // Got success from SLI
+ try {
+
+ serviceData = serviceDataBuilder.build();
+ log.info("Updating MD-SAL for {} [{}] ServiceData: {}", SVC_OPERATION, siid, serviceData);
+
+ // service object
+ ServiceBuilder serviceBuilder = new ServiceBuilder();
+ serviceBuilder.setServiceData(serviceData);
+ serviceBuilder.setServiceInstanceId(siid);
+ serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
+ saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
+
+ if (input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null)
+ {
+ // Only update operational tree on activate or delete
+ if (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign) ||
+ input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))
+ {
+ log.info("Updating OPERATIONAL tree.");
+ saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
+ }
+ }
+
+ TunnelxconnResponseInformationBuilder tunnelxconnResponseInformationBuilder = new TunnelxconnResponseInformationBuilder();
+ tunnelxconnResponseInformationBuilder.setInstanceId(allottedResourceId);
+ tunnelxconnResponseInformationBuilder.setObjectPath(tunnelxconnObjectPath);
+ responseBuilder.setTunnelxconnResponseInformation(tunnelxconnResponseInformationBuilder.build());
+
+ ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
+ serviceResponseInformationBuilder.setInstanceId(siid);
+ serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
+ responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
+
+ } catch (IllegalStateException e) {
+ log.error("Caught Exception updating MD-SAL for {} [{}] \n", SVC_OPERATION, siid, e);
+ responseBuilder.setResponseCode("500");
+ responseBuilder.setResponseMessage(e.toString());
+ responseBuilder.setAckFinalIndicator("Y");
+ log.error("Returned FAILED for {} [{}] {}", SVC_OPERATION, siid, responseBuilder.build());
+ RpcResult<TunnelxconnTopologyOperationOutput> rpcResult =
+ RpcResultBuilder.<TunnelxconnTopologyOperationOutput> status(true).withResult(responseBuilder.build()).build();
+ return Futures.immediateFuture(rpcResult);
+ }
+
+ // Update succeeded
+ responseBuilder.setResponseCode(errorCode);
+ responseBuilder.setAckFinalIndicator(ackFinal);
+ if (errorMessage != null)
+ {
+ responseBuilder.setResponseMessage(errorMessage);
+ }
+ log.info("Updated MD-SAL for {} [{}]", SVC_OPERATION, siid);
+ log.info("Returned SUCCESS for {} [{}] {}", SVC_OPERATION, siid, responseBuilder.build());
+
+ RpcResult<TunnelxconnTopologyOperationOutput> rpcResult =
+ RpcResultBuilder.<TunnelxconnTopologyOperationOutput> status(true).withResult(responseBuilder.build()).build();
+ return Futures.immediateFuture(rpcResult);
+ }
+
+ @Override
+ public Future<RpcResult<BrgTopologyOperationOutput>> brgTopologyOperation(BrgTopologyOperationInput input) {
+ final String SVC_OPERATION = "brg-topology-operation";
+ ServiceData serviceData;
+ ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
+ Properties parms = new Properties();
+
+ log.info("{} called.", SVC_OPERATION);
+ // create a new response object
+ BrgTopologyOperationOutputBuilder responseBuilder = new BrgTopologyOperationOutputBuilder();
+
+ if(input == null ||
+ input.getServiceInformation() == null ||
+ input.getServiceInformation().getServiceInstanceId() == null ||
+ input.getServiceInformation().getServiceInstanceId().length() == 0)
+ {
+ log.debug("exiting {} because of null or empty service-instance-id", SVC_OPERATION);
+ responseBuilder.setResponseCode("404");
+ responseBuilder.setResponseMessage("invalid input, null or empty service-instance-id");
+ responseBuilder.setAckFinalIndicator("Y");
+ RpcResult<BrgTopologyOperationOutput> rpcResult =
+ RpcResultBuilder.<BrgTopologyOperationOutput> status(true).withResult(responseBuilder.build()).build();
+ return Futures.immediateFuture(rpcResult);
+ }
+
+ String siid = input.getServiceInformation().getServiceInstanceId();
+
+ // Get the service-instance service data from MD-SAL
+ ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
+ getServiceData(siid,serviceDataBuilder);
+
+ if (input.getSdncRequestHeader() != null) {
+ responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
+ }
+
+ ServiceData sd = serviceDataBuilder.build();
+ if (sd == null || sd.getServiceLevelOperStatus() == null)
+ {
+ log.debug("exiting {} because the service-instance does not have any service data in SDNC", SVC_OPERATION);
+ responseBuilder.setResponseCode("404");
+ responseBuilder.setResponseMessage("invalid input: the service-instance does not have any service data in SDNC");
+ responseBuilder.setAckFinalIndicator("Y");
+ RpcResult<BrgTopologyOperationOutput> rpcResult =
+ RpcResultBuilder.<BrgTopologyOperationOutput> status(true).withResult(responseBuilder.build()).build();
+ return Futures.immediateFuture(rpcResult);
+ }
+
+ log.info("Adding INPUT data for {} [{}] input: {}", SVC_OPERATION, siid, input);
+ BrgTopologyOperationInputBuilder inputBuilder = new BrgTopologyOperationInputBuilder(input);
+ GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
+
+ // Call SLI sync method
+ // Get SvcLogicService reference
+
+ GenericResourceApiSvcLogicServiceClient svcLogicClient = new GenericResourceApiSvcLogicServiceClient();
+ Properties respProps = null;
+
+ String errorCode = "200";
+ String errorMessage = null;
+ String ackFinal = "Y";
+ String allottedResourceId = "error";
+ String serviceObjectPath = null;
+ String brgObjectPath = null;
+
+ try
+ {
+ if (svcLogicClient.hasGraph(appName, SVC_OPERATION , null, "sync"))
+ {
+
+ try
+ {
+ respProps = svcLogicClient.execute(appName, SVC_OPERATION, null, "sync", serviceDataBuilder, parms);
+ }
+ catch (Exception e)
+ {
+ log.error("Caught exception executing service logic for {}", SVC_OPERATION, e);
+ errorMessage = e.getMessage();
+ errorCode = "500";
+ }
+ } else {
+ errorMessage = "No service logic active for "+ appName +": '" + SVC_OPERATION + "'";
+ errorCode = "503";
+ }
+ }
+ catch (Exception e)
+ {
+ errorCode = "500";
+ errorMessage = e.getMessage();
+ log.error("Caught exception looking for service logic", e);
+ }
+
+
+ if (respProps != null)
+ {
+ errorCode = respProps.getProperty("error-code");
+ errorMessage = respProps.getProperty("error-message");
+ ackFinal = respProps.getProperty("ack-final", "Y");
+ allottedResourceId = respProps.getProperty("allotted-resource-id");
+ serviceObjectPath = respProps.getProperty("service-object-path");
+ brgObjectPath = respProps.getProperty("brg-object-path");
+ }
+
+ if ( errorCode != null && errorCode.length() != 0 && !( errorCode.equals("0")|| errorCode.equals("200"))) {
+ responseBuilder.setResponseCode(errorCode);
+ responseBuilder.setResponseMessage(errorMessage);
+ responseBuilder.setAckFinalIndicator(ackFinal);
+
+ log.error("Returned FAILED for {} [{}] {}", SVC_OPERATION, siid, responseBuilder.build());
+
+ RpcResult<BrgTopologyOperationOutput> rpcResult =
+ RpcResultBuilder.<BrgTopologyOperationOutput> status(true).withResult(responseBuilder.build()).build();
+ return Futures.immediateFuture(rpcResult);
+ }
+
+ // Got success from SLI
+ try {
+
+ serviceData = serviceDataBuilder.build();
+ log.info("Updating MD-SAL for {} [{}] ServiceData: {}", SVC_OPERATION, siid, serviceData);
+
+ // service object
+ ServiceBuilder serviceBuilder = new ServiceBuilder();
+ serviceBuilder.setServiceData(serviceData);
+ serviceBuilder.setServiceInstanceId(siid);
+ serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
+ saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
+
+ if (input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null)
+ {
+ // Only update operational tree on activate or delete
+ if (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign) ||
+ input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))
+ {
+ log.info("Updating OPERATIONAL tree.");
+ saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
+ }
+ }
+
+ BrgResponseInformationBuilder brgResponseInformationBuilder = new BrgResponseInformationBuilder();
+ brgResponseInformationBuilder.setInstanceId(allottedResourceId);
+ brgResponseInformationBuilder.setObjectPath(brgObjectPath);
+ responseBuilder.setBrgResponseInformation(brgResponseInformationBuilder.build());
+
+ ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
+ serviceResponseInformationBuilder.setInstanceId(siid);
+ serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
+ responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
+
+ } catch (IllegalStateException e) {
+ log.error("Caught Exception updating MD-SAL for {} [{}] \n", SVC_OPERATION, siid, e);
+ responseBuilder.setResponseCode("500");
+ responseBuilder.setResponseMessage(e.toString());
+ responseBuilder.setAckFinalIndicator("Y");
+ log.error("Returned FAILED for {} [{}] {}", SVC_OPERATION, siid, responseBuilder.build());
+ RpcResult<BrgTopologyOperationOutput> rpcResult =
+ RpcResultBuilder.<BrgTopologyOperationOutput> status(true).withResult(responseBuilder.build()).build();
+ return Futures.immediateFuture(rpcResult);
+ }
+
+ // Update succeeded
+ responseBuilder.setResponseCode(errorCode);
+ responseBuilder.setAckFinalIndicator(ackFinal);
+ if (errorMessage != null)
+ {
+ responseBuilder.setResponseMessage(errorMessage);
+ }
+ log.info("Updated MD-SAL for {} [{}]", SVC_OPERATION, siid);
+ log.info("Returned SUCCESS for {} [{}] {}", SVC_OPERATION, siid, responseBuilder.build());
+
+ RpcResult<BrgTopologyOperationOutput> rpcResult =
+ RpcResultBuilder.<BrgTopologyOperationOutput> status(true).withResult(responseBuilder.build()).build();
+ return Futures.immediateFuture(rpcResult);
+ }
+
@Override
public Future<RpcResult<PreloadVnfTopologyOperationOutput>> preloadVnfTopologyOperation(
PreloadVnfTopologyOperationInput input) {
@@ -2074,4 +2434,6 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
RpcResultBuilder.<PreloadNetworkTopologyOperationOutput> status(true).withResult(responseBuilder.build()).build();
return Futures.immediateFuture(rpcResult);
}
+
+
}
diff --git a/generic-resource-api/provider/src/main/java/org/onap/sdnc/northbound/GenericResourceApiUtil.java b/generic-resource-api/provider/src/main/java/org/onap/sdnc/northbound/GenericResourceApiUtil.java
index 6e6da0e4..c03bc120 100644
--- a/generic-resource-api/provider/src/main/java/org/onap/sdnc/northbound/GenericResourceApiUtil.java
+++ b/generic-resource-api/provider/src/main/java/org/onap/sdnc/northbound/GenericResourceApiUtil.java
@@ -40,8 +40,8 @@ public class GenericResourceApiUtil extends MdsalHelper {
// Trick class loader into loading builders. Some of
// these will be needed later by Reflection classes, but need
// to explicitly "new" them here to get class loader to load them.
- org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ecomp.model.information.EcompModelInformationBuilder u1 =
- new org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ecomp.model.information.EcompModelInformationBuilder();
+ org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.onap.model.information.OnapModelInformationBuilder u1 =
+ new org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.onap.model.information.OnapModelInformationBuilder();
org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.network.assignments.NetworkAssignmentsBuilder u2 =
new org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.network.assignments.NetworkAssignmentsBuilder();
org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.network.information.NetworkInformationBuilder u3 =
diff --git a/generic-resource-api/provider/src/test/java/org/onap/sdnc/northbound/TestGenericResourceApi.java b/generic-resource-api/provider/src/test/java/org/onap/sdnc/northbound/TestGenericResourceApi.java
new file mode 100644
index 00000000..1230cd26
--- /dev/null
+++ b/generic-resource-api/provider/src/test/java/org/onap/sdnc/northbound/TestGenericResourceApi.java
@@ -0,0 +1,129 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.sdnc.northbound;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import org.junit.Before;
+import org.junit.Test;
+import static org.mockito.Mockito.mock;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
+import org.opendaylight.controller.md.sal.binding.test.AbstractConcurrentDataBrokerTest;
+import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.NetworkTopologyOperationOutput;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServiceTopologyOperationInputBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.NetworkTopologyOperationInputBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServiceTopologyOperationOutput;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.network.information.NetworkInformationBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.request.information.RequestInformation.RequestAction;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.request.information.RequestInformationBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.sdnc.request.header.SdncRequestHeader.SvcAction;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.sdnc.request.header.SdncRequestHeaderBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.information.ServiceInformationBuilder;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TestGenericResourceApi extends AbstractConcurrentDataBrokerTest {
+
+ private GenericResourceApiProvider genericResourceApiProvider;
+ private static final Logger LOG = LoggerFactory.getLogger(GenericResourceApiProvider.class);
+
+ @Before
+ public void setUp() throws Exception {
+ if (null == genericResourceApiProvider) {
+ DataBroker dataBroker = getDataBroker();
+ NotificationPublishService mockNotification = mock(NotificationPublishService.class);
+ RpcProviderRegistry mockRpcRegistry = mock(RpcProviderRegistry.class);
+ genericResourceApiProvider = new GenericResourceApiProvider(dataBroker, mockNotification, mockRpcRegistry);
+ }
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void testServiceTopologyOperation() {
+
+ ServiceTopologyOperationInputBuilder inputBuilder = new ServiceTopologyOperationInputBuilder();
+
+ SdncRequestHeaderBuilder sdncRequestHeaderBuilder = new SdncRequestHeaderBuilder();
+ sdncRequestHeaderBuilder.setSvcRequestId("1111");
+ sdncRequestHeaderBuilder.setSvcAction(SvcAction.Assign);
+ inputBuilder.setSdncRequestHeader(sdncRequestHeaderBuilder.build());
+
+ RequestInformationBuilder requestInformationBuilder = new RequestInformationBuilder();
+ requestInformationBuilder.setRequestId("1111");
+ requestInformationBuilder.setRequestAction(RequestAction.CreateServiceInstance);
+ inputBuilder.setRequestInformation(requestInformationBuilder.build());
+
+ ServiceInformationBuilder serviceInformationBuilder = new ServiceInformationBuilder();
+ serviceInformationBuilder.setServiceInstanceId("1111");
+ inputBuilder.setServiceInformation(serviceInformationBuilder.build());
+
+ // TODO: currently initialize GenericResourceApiSvcLogicServiceClient is failing, need to fix
+ java.util.concurrent.Future<RpcResult<ServiceTopologyOperationOutput>> future = genericResourceApiProvider
+ .serviceTopologyOperation(inputBuilder.build());
+ RpcResult<ServiceTopologyOperationOutput> rpcResult = null;
+ try {
+ rpcResult = future.get();
+ } catch (Exception e) {
+ fail("Error : " + e);
+ }
+ LOG.info("result: {}", rpcResult);
+ assertEquals("1111", rpcResult.getResult().getSvcRequestId());
+ }
+
+ @Test
+ public void testNetworkTopologyOperation() {
+
+ NetworkTopologyOperationInputBuilder inputBuilder = new NetworkTopologyOperationInputBuilder();
+
+ SdncRequestHeaderBuilder sdncRequestHeaderBuilder = new SdncRequestHeaderBuilder();
+ sdncRequestHeaderBuilder.setSvcRequestId("1111");
+ sdncRequestHeaderBuilder.setSvcAction(SvcAction.Create);
+ inputBuilder.setSdncRequestHeader(sdncRequestHeaderBuilder.build());
+
+ RequestInformationBuilder requestInformationBuilder = new RequestInformationBuilder();
+ requestInformationBuilder.setRequestId("1111");
+ requestInformationBuilder.setRequestAction(RequestAction.CreateNetworkInstance);
+ inputBuilder.setRequestInformation(requestInformationBuilder.build());
+
+ ServiceInformationBuilder serviceInformationBuilder = new ServiceInformationBuilder();
+ serviceInformationBuilder.setServiceInstanceId("1111");
+ inputBuilder.setServiceInformation(serviceInformationBuilder.build());
+
+ NetworkInformationBuilder networkInformationBuilder = new NetworkInformationBuilder();
+ inputBuilder.setNetworkInformation(networkInformationBuilder.build());
+
+ java.util.concurrent.Future<RpcResult<NetworkTopologyOperationOutput>> future = genericResourceApiProvider
+ .networkTopologyOperation(inputBuilder.build());
+ RpcResult<NetworkTopologyOperationOutput> rpcResult = null;
+ try {
+ rpcResult = future.get();
+ } catch (Exception e) {
+ fail("Error : " + e);
+ }
+ LOG.info("result: {}", rpcResult);
+ assertEquals("1111", rpcResult.getResult().getSvcRequestId());
+ }
+}
diff --git a/vnfapi/features/src/main/resources/features.xml b/vnfapi/features/src/main/resources/features.xml
index 5ea07002..3da86e07 100644
--- a/vnfapi/features/src/main/resources/features.xml
+++ b/vnfapi/features/src/main/resources/features.xml
@@ -30,7 +30,7 @@
<feature name='sdnc-vnfapi' description="sdnc-vnfapi" version='${project.version}'>
<!-- Most applications will have a dependency on the ODL MD-SAL Broker -->
<feature version="${odl.mdsal.version}">odl-mdsal-broker</feature>
- <feature version="${sdnctl.sli.version}">sdnc-sli</feature>
+ <feature>sdnc-sli</feature>
<bundle>mvn:org.onap.sdnc.northbound/vnfapi-model/${project.version}</bundle>
<bundle>mvn:org.onap.sdnc.northbound/vnfapi-provider/${project.version}</bundle>
<configfile finalname="etc/opendaylight/karaf/200-vnfapi-provider.xml">mvn:org.openecomp.sdnc.northbound/vnfapi-provider/${project.version}/xml/config</configfile>
diff --git a/vnfapi/provider/src/main/java/org/onap/sdnc/vnfapi/VnfSdnUtil.java b/vnfapi/provider/src/main/java/org/onap/sdnc/vnfapi/VnfSdnUtil.java
index c4d8c52f..522ee7f9 100644
--- a/vnfapi/provider/src/main/java/org/onap/sdnc/vnfapi/VnfSdnUtil.java
+++ b/vnfapi/provider/src/main/java/org/onap/sdnc/vnfapi/VnfSdnUtil.java
@@ -53,23 +53,15 @@ public class VnfSdnUtil extends MdsalHelper {
File propFile = new File(ODLHOME.getAbsolutePath() + "/configuration/vnfapi.properties");
String propFileName = propFile.getAbsolutePath();
properties = new Properties();
- InputStream input = null;
if (propFile.isFile() && propFile.canRead()) {
- try {
- input = new FileInputStream(propFile);
+ try (InputStream input = new FileInputStream(propFile)) {
properties.load(input);
LOG.info("Loaded properties from " + propFileName );
setYangMappingProperties(properties);
+ } catch (IOException e) {
+ LOG.error("Failed to close properties file " + propFileName +"\n",e);
} catch (Exception e) {
LOG.error("Failed to load properties " + propFileName +"\n",e);
- } finally {
- if (input != null) {
- try {
- input.close();
- } catch (IOException e) {
- LOG.error("Failed to close properties file " + propFileName +"\n",e);
- }
- }
}
}
}