grouping service-topology {\r
container service-topology {\r
uses service-topology-identifier;\r
- uses ecomp-model-information;\r
+ uses onap-model-information;\r
uses service-assignments;\r
uses service-parameters;\r
}\r
leaf network-type {\r
type string;\r
}\r
- uses ecomp-model-information;\r
+ uses onap-model-information;\r
}\r
}\r
grouping network-request-input {\r
container network-topology {\r
uses network-topology-identifier-structure;\r
uses region-identifier;\r
- uses ecomp-model-information;\r
+ uses onap-model-information;\r
uses network-assignments;\r
uses network-parameters;\r
}\r
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)";\r
type string;\r
}\r
- uses ecomp-model-information;\r
+ uses onap-model-information;\r
}\r
}\r
grouping vnf-request-input {\r
container vnf-topology {\r
uses vnf-topology-identifier-structure;\r
uses region-identifier;\r
- uses ecomp-model-information;\r
+ uses onap-model-information;\r
uses vnf-resource-assignments;\r
container vnf-parameters-data {\r
uses param;\r
leaf vf-module-type {\r
type string;\r
}\r
- uses ecomp-model-information;\r
+ uses onap-model-information;\r
}\r
}\r
grouping vf-module-request-input {\r
container vf-module-topology {\r
uses vf-module-topology-identifier;\r
uses region-identifier;\r
- uses ecomp-model-information;\r
+ uses onap-model-information;\r
uses vf-module-assignments;\r
container vf-module-parameters {\r
uses param;\r
grouping contrail-route-topology {\r
container contrail-route-topology {\r
uses allotted-resource-identifiers;\r
- uses ecomp-model-information;\r
+ uses onap-model-information;\r
uses contrail-route-assignments;\r
container contrail-route-parameters {\r
uses param;\r
grouping security-zone-topology {\r
container security-zone-topology {\r
uses allotted-resource-identifiers;\r
- uses ecomp-model-information;\r
+ uses onap-model-information;\r
uses security-zone-assignments;\r
container security-zone-parameters {\r
uses param;\r
}\r
}\r
}\r
+ grouping tunnelxconn-operation-information {\r
+ uses sdnc-request-header;\r
+ uses request-information;\r
+ uses service-information;\r
+ uses allotted-resource-information;\r
+ uses tunnelxconn-request-input;\r
+ }\r
+ grouping tunnelxconn-request-input {\r
+ leaf brg-wan-mac-address {\r
+ type string;\r
+ }\r
+ }\r
+ grouping tunnelxconn-topology {\r
+ container tunnelxconn-topology {\r
+ uses allotted-resource-identifiers;\r
+ uses onap-model-information;\r
+ uses tunnelxconn-assignments;\r
+ container tunnelxconn-parameters {\r
+ uses param;\r
+ }\r
+ }\r
+ }\r
+ grouping tunnelxconn-assignments {\r
+ leaf vni {\r
+ description "The Network Controller will assign a VNI value from the associated vGMUX VNI pool";\r
+ type string;\r
+ }\r
+ leaf vgmux-bearer-ip {\r
+ description "The Network Controller will look up the vgmux bearer ip from the vgmux vf module";\r
+ type inet:ip-address;\r
+ }\r
+ leaf vgmux-lan-up {\r
+ description "The Network Controller will look up the vgmux lan ip from the vgmux vg module";\r
+ type inet:ip-address;\r
+ }\r
+ }\r
+ grouping brg-operation-information {\r
+ uses sdnc-request-header;\r
+ uses request-information;\r
+ uses service-information;\r
+ uses allotted-resource-information;\r
+ uses brg-request-input;\r
+ }\r
+ grouping brg-request-input {\r
+ leaf vgmux-bearer-ip {\r
+ type inet:ip-address;\r
+ }\r
+ leaf vni {\r
+ type string;\r
+ }\r
+ leaf brg-wan-ip-address {\r
+ type inet:ip-address;\r
+ }\r
+ }\r
+ grouping brg-topology {\r
+ container brg-topology {\r
+ uses allotted-resource-identifiers;\r
+ uses onap-model-information;\r
+ uses brg-assignments;\r
+ container brg-parameters {\r
+ uses param;\r
+ }\r
+ }\r
+ }\r
+ grouping brg-assignments {\r
+ leaf vbrg-wan-ip {\r
+ type inet:ip-address;\r
+ }\r
+ }\r
grouping allotted-resource-information {\r
container allotted-resource-information {\r
leaf allotted-resource-id {\r
description "Service-instance-id of the parent service to which this allotted resource belongs.";\r
type string;\r
}\r
- uses ecomp-model-information;\r
+ uses onap-model-information;\r
}\r
}\r
grouping allotted-resource-identifiers {\r
description "used to reference a&ai subscription-service-type. For example, we show as vIPR-ATM in example.";\r
type string;\r
}\r
- uses ecomp-model-information;\r
+ uses onap-model-information;\r
leaf service-instance-id {\r
type string;\r
}\r
}\r
}\r
}\r
- grouping ecomp-model-information {\r
- container ecomp-model-information {\r
+ grouping onap-model-information {\r
+ container onap-model-information {\r
leaf model-invariant-uuid {\r
description "identifies the invariant uuid for this service or resource";\r
type string;\r
uses instance-reference;\r
}\r
}\r
+ grouping tunnelxconn-response-information {\r
+ container tunnelxconn-response-information {\r
+ uses instance-reference;\r
+ }\r
+ }\r
+ grouping brg-response-information {\r
+ container brg-response-information {\r
+ uses instance-reference;\r
+ }\r
+ }\r
grouping preload-model-information {\r
list vnf-preload-list {\r
key "vnf-name vnf-type";\r
uses allotted-resource-status;\r
}\r
}\r
+ container tunnelxconn-allotted-resources {\r
+ list tunnelxconn-allotted-resource {\r
+ key "allotted-resource-id";\r
+ leaf allotted-resource-id {\r
+ type string;\r
+ mandatory true;\r
+ }\r
+ container allotted-resource-data {\r
+ container allotted-resource-operation-information {\r
+ uses tunnelxconn-operation-information;\r
+ }\r
+ uses tunnelxconn-topology;\r
+ container tunnelxconn-parameters {\r
+ uses param;\r
+ }\r
+ uses allotted-resource-oper-status;\r
+ }\r
+ uses allotted-resource-status;\r
+ }\r
+ }\r
+ container brg-allotted-respources {\r
+ list brg-allotted-resource {\r
+ key "allotted-resource-id";\r
+ leaf allotted-resource-id {\r
+ type string;\r
+ mandatory true;\r
+ }\r
+ container allotted-resource-data {\r
+ container allotted-resource-operation-information {\r
+ uses brg-operation-information;\r
+ }\r
+ uses brg-topology;\r
+ container brg-parameters {\r
+ uses param;\r
+ }\r
+ uses allotted-resource-oper-status;\r
+ }\r
+ uses allotted-resource-status;\r
+ }\r
+ }\r
rpc service-topology-operation {\r
input {\r
uses service-operation-information;\r
uses service-response-information;\r
}\r
}\r
+ rpc tunnelxconn-topology-operation {\r
+ input {\r
+ uses tunnelxconn-operation-information;\r
+ }\r
+ output {\r
+ uses topology-response-common;\r
+ uses tunnelxconn-response-information;\r
+ uses service-response-information;\r
+ }\r
+ }\r
+ rpc brg-topology-operation {\r
+ input {\r
+ uses brg-operation-information;\r
+ }\r
+ output {\r
+ uses topology-response-common;\r
+ uses brg-response-information;\r
+ uses service-response-information;\r
+ }\r
+ }\r
container preload-vnfs {\r
uses preload-model-information;\r
}\r
uses vnf-topology-response-body;\r
}\r
}\r
+\r
} ////closes the module\r
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;
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;
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;
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;
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) {
RpcResultBuilder.<PreloadNetworkTopologyOperationOutput> status(true).withResult(responseBuilder.build()).build();
return Futures.immediateFuture(rpcResult);
}
+
+
}