1 package org.onap.sdnc.northbound;
3 import java.text.DateFormat;
4 import java.text.SimpleDateFormat;
6 import java.util.Optional;
7 import java.util.Properties;
8 import java.util.TimeZone;
9 import java.util.concurrent.ExecutionException;
10 import java.util.concurrent.ExecutorService;
11 import java.util.concurrent.Executors;
13 import com.google.common.util.concurrent.FluentFuture;
14 import com.google.common.util.concurrent.Futures;
15 import com.google.common.util.concurrent.ListenableFuture;
17 import org.eclipse.jdt.annotation.NonNull;
18 import org.opendaylight.mdsal.binding.api.DataBroker;
19 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
20 import org.opendaylight.mdsal.binding.api.ReadTransaction;
21 import org.opendaylight.mdsal.binding.api.RpcProviderService;
22 import org.opendaylight.mdsal.binding.api.WriteTransaction;
23 import org.opendaylight.mdsal.common.api.CommitInfo;
24 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
25 import org.opendaylight.mdsal.common.api.OptimisticLockFailedException;
26 import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
27 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.*;
28 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.brg.response.information.BrgResponseInformationBuilder;
29 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.connection.attachment.response.information.ConnectionAttachmentResponseInformationBuilder;
30 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.contrail.route.response.information.ContrailRouteResponseInformationBuilder;
31 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.gc.response.information.GcResponseInformationBuilder;
32 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.network.response.information.NetworkResponseInformationBuilder;
33 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.pnf.response.information.PnfResponseInformationBuilder;
34 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.port.mirror.response.information.PortMirrorResponseInformationBuilder;
35 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.data.PreloadData;
36 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.data.PreloadDataBuilder;
37 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.model.information.PreloadList;
38 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.model.information.PreloadListBuilder;
39 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.model.information.PreloadListKey;
40 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.request.information.RequestInformation;
41 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.sdnc.request.header.SdncRequestHeader;
42 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.sdnc.request.header.SdncRequestHeader.SvcAction;
43 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.security.zone.response.information.SecurityZoneResponseInformationBuilder;
44 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.data.ServiceData;
45 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.data.ServiceDataBuilder;
46 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.model.infrastructure.Service;
47 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.model.infrastructure.ServiceBuilder;
48 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.model.infrastructure.ServiceKey;
49 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.response.information.ServiceResponseInformationBuilder;
50 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.status.ServiceStatus.RequestStatus;
51 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.status.ServiceStatus.RpcAction;
52 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.status.ServiceStatusBuilder;
53 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.tunnelxconn.response.information.TunnelxconnResponseInformationBuilder;
54 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.vf.module.response.information.VfModuleResponseInformationBuilder;
55 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.vnf.response.information.VnfResponseInformationBuilder;
56 import org.opendaylight.yangtools.concepts.ObjectRegistration;
57 import org.opendaylight.yangtools.yang.binding.DataObject;
58 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
59 import org.opendaylight.yangtools.yang.common.RpcResult;
60 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
61 import org.slf4j.Logger;
62 import org.slf4j.LoggerFactory;
65 * Defines a base implementation for your provider. This class extends from a helper class which provides storage for
66 * the most commonly used components of the MD-SAL. Additionally the base class provides some basic logging and
67 * initialization / clean up methods.
69 * To use this, copy and paste (overwrite) the following method into the TestApplicationProviderModule class which is
70 * auto generated under src/main/java in this project (created only once during first compilation):
75 * public java.lang.AutoCloseable createInstance() {
77 * // final GENERIC-RESOURCE-APIProvider provider = new
78 * // GENERIC-RESOURCE-APIProvider();
79 * final GenericResourceApiProvider provider = new GenericResourceApiProvider();
80 * provider.setDataBroker(getDataBrokerDependency());
81 * provider.setNotificationService(getNotificationServiceDependency());
82 * provider.setRpcService(getRpcServiceDependency());
83 * provider.initialize();
84 * return new AutoCloseable() {
87 * public void close() throws Exception {
88 * // TODO: CLOSE ANY REGISTRATION OBJECTS CREATED USING ABOVE
89 * // BROKER/NOTIFICATION
90 * // SERVIE/RPC REGISTRY
99 public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURCEAPIService {
101 protected static final String APP_NAME = "generic-resource-api";
102 private static final String CALLED_STR = "{} called.";
103 private static final String NULL_OR_EMPTY_ERROR_MESSAGE = "exiting {} because of null or empty service-instance-id";
104 protected static final String NULL_OR_EMPTY_ERROR_PARAM = "invalid input, null or empty service-instance-id";
105 private static final String ADDING_INPUT_DATA_LOG = "Adding INPUT data for {} [{}] input: {}";
106 private static final String ADDING_OPERATIONAL_DATA_LOG = "Adding OPERATIONAL data for {} [{}] operational-data: {}";
107 private static final String OPERATIONAL_DATA_PARAM = "operational-data";
108 protected static final String NO_SERVICE_LOGIC_ACTIVE = "No service logic active for ";
109 private static final String SERVICE_LOGIC_SEARCH_ERROR_MESSAGE = "Caught exception looking for service logic";
110 private static final String ERROR_CODE_PARAM = "error-code";
111 private static final String ERROR_MESSAGE_PARAM = "error-message";
112 private static final String ACK_FINAL_PARAM = "ack-final";
113 private static final String SERVICE_OBJECT_PATH_PARAM = "service-object-path";
114 private static final String NETWORK_OBJECT_PATH_PARAM = "network-object-path";
115 private static final String VNF_OBJECT_PATH_PARAM = "vnf-object-path";
116 private static final String PNF_OBJECT_PATH_PARAM = "pnf-object-path";
117 private static final String VF_MODULE_OBJECT_PATH_PARAM = "vf-module-object-path";
118 private static final String VF_MODULE_ID_PARAM = "vf-module-id";
119 private static final String UPDATING_MDSAL_ERROR_MESSAGE = "Caught Exception updating MD-SAL for {} [{}] \n";
120 private static final String UPDATING_MDSAL_ERROR_MESSAGE_2 = "Caught Exception updating MD-SAL for {} [{},{}] \n";
121 private static final String RETURNED_FAILED_MESSAGE = "Returned FAILED for {} [{}] {}";
122 private static final String UPDATING_MDSAL_INFO_MESSAGE = "Updating MD-SAL for {} [{}] ServiceData: {}";
123 private static final String UPDATED_MDSAL_INFO_MESSAGE = "Updated MD-SAL for {} [{}]";
124 private static final String RETURNED_SUCCESS_MESSAGE = "Returned SUCCESS for {} [{}] {}";
125 private static final String NON_NULL_PARAM = "non-null";
126 private static final String NULL_PARAM = "null";
127 private static final String SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE = "Caught exception executing service logic for {} ";
128 private static final String UPDATING_TREE_INFO_MESSAGE = "Updating OPERATIONAL tree.";
129 private static final String EMPTY_SERVICE_INSTANCE_MESSAGE = "exiting {} because the service-instance does not have any service data in SDNC";
130 protected static final String INVALID_INPUT_ERROR_MESSAGE = "invalid input: the service-instance does not have any service data in SDNC";
131 private static final String ALLOTTED_RESOURCE_ID_PARAM = "allotted-resource-id";
132 private static final String ERROR_NETWORK_ID = "error";
133 private static final String BACKGROUND_THREAD_STARTED_MESSAGE = "Start background thread";
134 private static final String BACKGROUND_THREAD_INFO = "Background thread: input conf_id is {}";
135 private static final String SKIP_MDSAL_UPDATE_PROP = "skip-mdsal-update";
137 private final Logger log = LoggerFactory.getLogger(GenericResourceApiProvider.class);
138 private final ExecutorService executor;
139 private final GenericResourceApiSvcLogicServiceClient svcLogicClient;
141 protected DataBroker dataBroker;
142 protected NotificationPublishService notificationService;
143 protected RpcProviderService rpcService;
144 protected ObjectRegistration<GENERICRESOURCEAPIService> rpcRegistration;
146 public GenericResourceApiProvider(DataBroker dataBroker, NotificationPublishService notificationPublishService,
147 RpcProviderService rpcProviderService, GenericResourceApiSvcLogicServiceClient client) {
148 log.info("Creating provider for {}", APP_NAME);
149 executor = Executors.newFixedThreadPool(1);
150 setDataBroker(dataBroker);
151 setNotificationService(notificationPublishService);
152 setRpcService(rpcProviderService);
153 svcLogicClient = client;
158 public void initialize() {
159 log.info("Initializing provider for {}", APP_NAME);
160 // Create the top level containers
163 GenericResourceApiUtil.loadProperties();
164 } catch (Exception e) {
165 log.error("Caught Exception while trying to load properties file", e);
168 if (rpcRegistration == null) {
169 if (rpcService != null) {
170 rpcRegistration = rpcService.registerRpcImplementation(GENERICRESOURCEAPIService.class, this);
174 log.info("Initialization complete for {}", APP_NAME);
177 protected void initializeChild() {
178 // Override if you have custom initialization intelligence
182 public void close() throws Exception {
183 log.info("Closing provider for {}", APP_NAME);
185 rpcRegistration.close();
186 log.info("Successfully closed provider for {}", APP_NAME);
189 private static class Iso8601Util {
191 private static TimeZone timeZone = TimeZone.getTimeZone("UTC");
192 private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
194 private Iso8601Util() {
198 dateFormat.setTimeZone(timeZone);
201 private static String now() {
202 return dateFormat.format(new Date());
206 public void setDataBroker(DataBroker dataBroker) {
207 this.dataBroker = dataBroker;
208 if (log.isDebugEnabled()) {
209 log.debug("DataBroker set to {}", dataBroker == null ? NULL_PARAM : NON_NULL_PARAM);
213 public void setNotificationService(NotificationPublishService notificationService) {
214 this.notificationService = notificationService;
215 if (log.isDebugEnabled()) {
216 log.debug("Notification Service set to {}", notificationService == null ? NULL_PARAM : NON_NULL_PARAM);
220 public void setRpcService(RpcProviderService rpcService) {
221 this.rpcService = rpcService;
222 if (log.isDebugEnabled()) {
223 log.debug("rpcService set to {}", rpcService == null ? NULL_PARAM : NON_NULL_PARAM);
227 private void createContainers() {
229 final WriteTransaction configT = dataBroker.newReadWriteTransaction();
230 final WriteTransaction operT = dataBroker.newReadWriteTransaction();
234 // Create the service-instance container
235 configT.merge(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Services.class),
236 new ServicesBuilder().build());
237 operT.merge(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Services.class),
238 new ServicesBuilder().build());
240 // Create the PreloadInformation container
241 configT.merge(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(PreloadInformation.class),
242 new PreloadInformationBuilder().build());
243 operT.merge(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(PreloadInformation.class),
244 new PreloadInformationBuilder().build());
247 FluentFuture<? extends @NonNull CommitInfo> configCheckedFuture = configT.commit();
248 configCheckedFuture.get();
249 FluentFuture<? extends @NonNull CommitInfo> operCheckedFuture = operT.commit();
250 operCheckedFuture.get();
252 log.info("Create containers succeeded!");
254 } catch (InterruptedException | ExecutionException e) {
255 log.error("Create containers failed: ", e);
259 private void setServiceStatus(ServiceStatusBuilder serviceStatusBuilder, String errorCode, String errorMessage,
261 serviceStatusBuilder.setResponseCode(errorCode);
262 serviceStatusBuilder.setResponseMessage(errorMessage);
263 serviceStatusBuilder.setFinalIndicator(ackFinal);
264 serviceStatusBuilder.setResponseTimestamp(Iso8601Util.now());
267 private void setServiceStatus(ServiceStatusBuilder serviceStatusBuilder, RequestInformation requestInformation) {
268 if (requestInformation != null && requestInformation.getRequestAction() != null) {
269 serviceStatusBuilder.setAction(requestInformation.getRequestAction().toString());
273 private void setServiceStatus(ServiceStatusBuilder serviceStatusBuilder, SdncRequestHeader requestHeader) {
274 if (requestHeader != null && requestHeader.getSvcAction() != null) {
275 switch (requestHeader.getSvcAction()) {
277 serviceStatusBuilder.setRpcAction(RpcAction.Assign);
280 serviceStatusBuilder.setRpcAction(RpcAction.Unassign);
283 serviceStatusBuilder.setRpcAction(RpcAction.Activate);
286 serviceStatusBuilder.setRpcAction(RpcAction.Deactivate);
289 serviceStatusBuilder.setRpcAction(RpcAction.Delete);
292 serviceStatusBuilder.setRpcAction(RpcAction.Create);
295 log.error("Unknown SvcAction: {}", requestHeader.getSvcAction());
301 private void getServiceData(String siid, ServiceDataBuilder serviceDataBuilder) {
303 getServiceData(siid, serviceDataBuilder, LogicalDatastoreType.CONFIGURATION);
306 private void getServiceData(String siid, ServiceDataBuilder serviceDataBuilder, LogicalDatastoreType type) {
307 // See if any data exists yet for this siid, if so grab it.
308 InstanceIdentifier<Service> serviceInstanceIdentifier = InstanceIdentifier.<Services>builder(Services.class)
309 .child(Service.class, new ServiceKey(siid)).build();
311 Optional<Service> data = null;
313 try (final ReadTransaction readTx = dataBroker.newReadOnlyTransaction()) {
314 data = (Optional<Service>) readTx.read(type, serviceInstanceIdentifier).get();
315 } catch (final InterruptedException | ExecutionException e) {
316 log.error("Caught Exception reading MD-SAL ({}) data for [{}] ", type, siid, e);
319 if (data != null && data.isPresent()) {
320 ServiceData serviceData = data.get().getServiceData();
321 if (serviceData != null) {
322 log.info("Read MD-SAL ({}) data for [{}] ServiceData: {}", type, siid, serviceData);
323 serviceDataBuilder.setSdncRequestHeader(serviceData.getSdncRequestHeader());
324 serviceDataBuilder.setRequestInformation(serviceData.getRequestInformation());
325 serviceDataBuilder.setServiceInformation(serviceData.getServiceInformation());
326 serviceDataBuilder.setServiceRequestInput(serviceData.getServiceRequestInput());
327 serviceDataBuilder.setServiceTopology(serviceData.getServiceTopology());
328 serviceDataBuilder.setServiceLevelOperStatus(serviceData.getServiceLevelOperStatus());
329 serviceDataBuilder.setNetworks(serviceData.getNetworks());
330 serviceDataBuilder.setVnfs(serviceData.getVnfs());
331 serviceDataBuilder.setProvidedAllottedResources(serviceData.getProvidedAllottedResources());
332 serviceDataBuilder.setConsumedAllottedResources(serviceData.getConsumedAllottedResources());
333 serviceDataBuilder.setNetworkInstanceGroups(serviceData.getNetworkInstanceGroups());
334 serviceDataBuilder.setVnfcInstanceGroups(serviceData.getVnfcInstanceGroups());
335 serviceDataBuilder.setForwardingPaths(serviceData.getForwardingPaths());
336 serviceDataBuilder.setProvidedConfigurations(serviceData.getProvidedConfigurations());
337 // service-instance-id needs to be set
339 log.info("No service-data found in MD-SAL ({}) for [{}]", type, siid);
342 log.info("No data found in MD-SAL ({}) for [{}]", type, siid);
346 private void saveService(final Service entry, boolean merge, LogicalDatastoreType storeType) {
347 // Each entry will be identifiable by a unique key, we have to create that
349 InstanceIdentifier<Service> path = InstanceIdentifier.builder(Services.class)
350 .child(Service.class, entry.key()).build();
352 trySaveEntry(entry, merge, storeType, path);
355 private <T extends DataObject> void trySaveEntry(T entry, boolean merge, LogicalDatastoreType storeType,
356 InstanceIdentifier<T> path) {
360 save(entry, merge, storeType, path);
362 } catch (OptimisticLockFailedException e) {
364 log.debug("Got OptimisticLockFailedException on last try - failing ");
365 throw new IllegalStateException(e);
367 log.debug("Got OptimisticLockFailedException - trying again ");
368 } catch (TransactionCommitFailedException|InterruptedException|ExecutionException ex) {
369 log.debug("Update DataStore failed");
370 throw new IllegalStateException(ex);
375 private <T extends DataObject> void save(T entry, boolean merge, LogicalDatastoreType storeType,
376 InstanceIdentifier<T> path) throws TransactionCommitFailedException, InterruptedException,
378 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
380 tx.merge(storeType, path, entry);
382 tx.put(storeType, path, entry);
385 log.debug("Update DataStore succeeded");
388 private void deleteService(final Service entry, LogicalDatastoreType storeType) {
389 // Each entry will be identifiable by a unique key, we have to create
391 InstanceIdentifier<Service> path = InstanceIdentifier.builder(Services.class)
392 .child(Service.class, entry.key()).build();
394 tryDeleteEntry(storeType, path);
397 private void tryDeleteEntry(LogicalDatastoreType storeType, InstanceIdentifier<Service> path) {
401 delete(storeType, path);
403 } catch (OptimisticLockFailedException e) {
405 log.debug("Got OptimisticLockFailedException on last try - failing ");
406 throw new IllegalStateException(e);
408 log.debug("Got OptimisticLockFailedException - trying again ");
409 } catch (TransactionCommitFailedException|InterruptedException|ExecutionException ex) {
410 log.debug("Update DataStore failed");
411 throw new IllegalStateException(ex);
416 private void delete(LogicalDatastoreType storeType, InstanceIdentifier<Service> path)
417 throws TransactionCommitFailedException, InterruptedException, ExecutionException {
418 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
419 tx.delete(storeType, path);
421 log.debug("DataStore delete succeeded");
424 private void getPreloadData(String vnf_name, String vnf_type, PreloadDataBuilder preloadDataBuilder) {
426 getPreloadData(vnf_name, vnf_type, preloadDataBuilder, LogicalDatastoreType.CONFIGURATION);
429 private void getPreloadData(String preloadName, String preloadType, PreloadDataBuilder preloadDataBuilder,
430 LogicalDatastoreType type) {
431 // See if any data exists yet for this name/type, if so grab it.
432 InstanceIdentifier preloadInstanceIdentifier = InstanceIdentifier
433 .<PreloadInformation>builder(PreloadInformation.class)
434 .child(PreloadList.class, new PreloadListKey(preloadName, preloadType)).build();
436 Optional<PreloadList> data = null;
437 try (final ReadTransaction readTx = dataBroker.newReadOnlyTransaction()) {
438 data = (Optional<PreloadList>) readTx.read(type, preloadInstanceIdentifier).get();
439 } catch (final InterruptedException | ExecutionException e) {
440 log.error("Caught Exception reading MD-SAL ({}) for [{},{}] ", type, preloadName, preloadType, e);
443 if (data != null && data.isPresent()) {
444 PreloadData preloadData = data.get().getPreloadData();
445 if (preloadData != null) {
446 log.info("Read MD-SAL ({}) data for [{},{}] PreloadData: {}", type, preloadName, preloadType,
449 .setPreloadVfModuleTopologyInformation(preloadData.getPreloadVfModuleTopologyInformation());
451 .setPreloadNetworkTopologyInformation(preloadData.getPreloadNetworkTopologyInformation());
452 preloadDataBuilder.setPreloadOperStatus(preloadData.getPreloadOperStatus());
454 log.info("No preload-data found in MD-SAL ({}) for [{},{}] ", type, preloadName, preloadType);
457 log.info("No data found in MD-SAL ({}) for [{},{}] ", type, preloadName, preloadType);
461 private void savePreloadList(final PreloadList entry, boolean merge, LogicalDatastoreType storeType)
462 throws IllegalStateException {
464 // Each entry will be identifiable by a unique key, we have to create that
466 InstanceIdentifier.InstanceIdentifierBuilder<PreloadList> preloadListBuilder = InstanceIdentifier
467 .<PreloadInformation>builder(PreloadInformation.class).child(PreloadList.class, entry.key());
468 InstanceIdentifier<PreloadList> path = preloadListBuilder.build();
472 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
474 tx.merge(storeType, path, entry);
476 tx.put(storeType, path, entry);
479 log.debug("Update DataStore succeeded");
481 } catch (final InterruptedException | ExecutionException e) {
482 if (e instanceof OptimisticLockFailedException) {
484 log.debug("Got OptimisticLockFailedException on last try - failing ");
485 throw new IllegalStateException(e);
487 log.debug("Got OptimisticLockFailedException - trying again ");
489 log.debug("Update DataStore failed");
490 throw new IllegalStateException(e);
496 private void deletePreloadList(final PreloadList entry, LogicalDatastoreType storeType) {
497 // Each entry will be identifiable by a unique key, we have to create
499 InstanceIdentifier<PreloadList> path = InstanceIdentifier.builder(PreloadInformation.class)
500 .child(PreloadList.class, entry.key()).build();
502 tryDeletePreloadListEntry(storeType, path);
505 private void tryDeletePreloadListEntry(LogicalDatastoreType storeType, InstanceIdentifier<PreloadList> path) {
509 deletePreloadList(storeType, path);
511 } catch (OptimisticLockFailedException e) {
513 log.debug("Got OptimisticLockFailedException on last try - failing ");
514 throw new IllegalStateException(e);
516 log.debug("Got OptimisticLockFailedException - trying again ");
517 } catch (TransactionCommitFailedException|InterruptedException|ExecutionException ex) {
518 log.debug("Update DataStore failed");
519 throw new IllegalStateException(ex);
524 private void deletePreloadList(LogicalDatastoreType storeType, InstanceIdentifier<PreloadList> path)
525 throws TransactionCommitFailedException, InterruptedException, ExecutionException {
526 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
527 tx.delete(storeType, path);
529 log.debug("DataStore delete succeeded");
533 public ListenableFuture<RpcResult<ServiceTopologyOperationOutput>> serviceTopologyOperation(
534 ServiceTopologyOperationInput input) {
536 final String svcOperation = "service-topology-operation";
537 ServiceData serviceData;
538 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
539 Properties parms = new Properties();
541 log.info(CALLED_STR, svcOperation);
542 // create a new response object
543 ServiceTopologyOperationOutputBuilder responseBuilder = new ServiceTopologyOperationOutputBuilder();
545 if (hasInvalidServiceId(input)) {
546 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
547 responseBuilder.setResponseCode("404");
548 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
549 responseBuilder.setAckFinalIndicator("Y");
551 RpcResult<ServiceTopologyOperationOutput> rpcResult = RpcResultBuilder
552 .<ServiceTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
554 return Futures.immediateFuture(rpcResult);
557 // Grab the service instance ID from the input buffer
558 String siid = input.getServiceInformation().getServiceInstanceId();
560 trySetSvcRequestId(input, responseBuilder);
562 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
563 getServiceData(siid, serviceDataBuilder);
565 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
566 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
568 // Set the serviceStatus based on input
569 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
570 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
573 * // setup a service-data object builder // ACTION service-topology-operation
574 * // INPUT: // USES uses service-operation-information // OUTPUT: // uses
575 * topology-response-common; // uses service-response-information;
578 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
579 ServiceTopologyOperationInputBuilder inputBuilder = new ServiceTopologyOperationInputBuilder(input);
580 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
582 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
583 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
585 // Call SLI sync method
586 ResponseObject responseObject = new ResponseObject("200", "");
587 String ackFinal = "Y";
588 String serviceObjectPath = null;
589 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
591 if (respProps != null) {
592 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
593 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
594 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
595 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
598 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
599 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
600 serviceStatusBuilder.setRpcName(svcOperation);
602 if (failed(responseObject)) {
603 responseBuilder.setResponseCode(responseObject.getStatusCode());
604 responseBuilder.setResponseMessage(responseObject.getMessage());
605 responseBuilder.setAckFinalIndicator(ackFinal);
607 ServiceBuilder serviceBuilder = new ServiceBuilder();
608 serviceBuilder.setServiceInstanceId(siid);
609 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
611 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
612 } catch (Exception e) {
613 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
615 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
617 RpcResult<ServiceTopologyOperationOutput> rpcResult = RpcResultBuilder
618 .<ServiceTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
620 return Futures.immediateFuture(rpcResult);
623 // Got success from SLI
625 serviceData = serviceDataBuilder.build();
626 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
629 ServiceBuilder serviceBuilder = new ServiceBuilder();
630 serviceBuilder.setServiceData(serviceData);
631 serviceBuilder.setServiceInstanceId(siid);
632 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
633 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
635 tryDeleteService(input, serviceBuilder);
637 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
638 serviceResponseInformationBuilder.setInstanceId(siid);
639 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
640 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
642 } catch (Exception e) {
643 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
644 responseBuilder.setResponseCode("500");
645 responseBuilder.setResponseMessage(e.getMessage());
646 responseBuilder.setAckFinalIndicator("Y");
647 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
649 RpcResult<ServiceTopologyOperationOutput> rpcResult = RpcResultBuilder
650 .<ServiceTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
652 return Futures.immediateFuture(rpcResult);
656 responseBuilder.setResponseCode(responseObject.getStatusCode());
657 responseBuilder.setAckFinalIndicator(ackFinal);
658 trySetResponseMessage(responseBuilder, responseObject);
659 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
660 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
662 RpcResult<ServiceTopologyOperationOutput> rpcResult = RpcResultBuilder
663 .<ServiceTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
665 return Futures.immediateFuture(rpcResult);
668 private void trySetResponseMessage(ServiceTopologyOperationOutputBuilder responseBuilder,
669 ResponseObject responseObject) {
670 if (responseObject.getMessage() != null) {
671 responseBuilder.setResponseMessage(responseObject.getMessage());
675 private boolean hasInvalidServiceId(ServiceTopologyOperationInput input) {
676 return input == null || input.getServiceInformation() == null
677 || input.getServiceInformation().getServiceInstanceId() == null
678 || input.getServiceInformation().getServiceInstanceId().length() == 0;
681 private void trySetSvcRequestId(ServiceTopologyOperationInput input,
682 ServiceTopologyOperationOutputBuilder responseBuilder) {
683 if (input.getSdncRequestHeader() != null) {
684 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
688 private void tryDeleteService(ServiceTopologyOperationInput input, ServiceBuilder serviceBuilder) {
689 if (isValidRequest(input) && input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete)) {
690 // Only update operational tree on delete
691 log.info("Delete from both CONFIGURATION and OPERATIONAL tree.");
692 deleteService(serviceBuilder.build(), LogicalDatastoreType.OPERATIONAL);
693 deleteService(serviceBuilder.build(), LogicalDatastoreType.CONFIGURATION);
697 private Properties tryGetProperties(String svcOperation, Properties parms, ServiceDataBuilder serviceDataBuilder,
698 ResponseObject responseObject) {
700 if (svcLogicClient.hasGraph(APP_NAME, svcOperation, null, "sync")) {
702 return svcLogicClient.execute(APP_NAME, svcOperation, null, "sync", serviceDataBuilder, parms);
703 } catch (Exception e) {
704 log.error(SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE, svcOperation, e);
705 responseObject.setMessage(e.getMessage());
706 responseObject.setStatusCode("500");
709 responseObject.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
710 responseObject.setStatusCode("503");
712 } catch (Exception e) {
713 responseObject.setMessage(e.getMessage());
714 responseObject.setStatusCode("500");
715 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
721 private boolean failed(ResponseObject error) {
722 return !error.getStatusCode().isEmpty()
723 && !("0".equals(error.getStatusCode()) || "200".equals(error.getStatusCode()));
726 private boolean isValidRequest(ServiceTopologyOperationInput input) {
727 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
732 public ListenableFuture<RpcResult<PnfTopologyOperationOutput>> pnfTopologyOperation(
733 PnfTopologyOperationInput input) {
735 final String svcOperation = "pnf-topology-operation";
736 ServiceData serviceData;
737 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
738 Properties properties = new Properties();
740 log.info(CALLED_STR, svcOperation);
741 // create a new response object
742 PnfTopologyOperationOutputBuilder responseBuilder = new PnfTopologyOperationOutputBuilder();
744 if (hasInvalidServiceId(input)) {
745 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
746 responseBuilder.setResponseCode("404");
747 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
748 responseBuilder.setAckFinalIndicator("Y");
749 RpcResult<PnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<PnfTopologyOperationOutput>status(true)
750 .withResult(responseBuilder.build()).build();
752 return Futures.immediateFuture(rpcResult);
755 // Grab the service instance ID from the input buffer
756 String siid = input.getServiceInformation().getServiceInstanceId();
758 trySetSvcRequestId(input, responseBuilder);
760 /* Comment out mandatory check for pnf id for scenario wherein for assign/create request pnf-id is generated by
762 if (hasInvalidPnfId(input)) {
763 log.debug("exiting {} because of null or empty pnf-id", svcOperation);
764 responseBuilder.setResponseCode("404");
765 responseBuilder.setResponseMessage("invalid input, null or empty pnf-id");
766 responseBuilder.setAckFinalIndicator("Y");
768 RpcResult<PnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<PnfTopologyOperationOutput>status(true)
769 .withResult(responseBuilder.build()).build();
771 return Futures.immediateFuture(rpcResult);
775 String pnfId = input.getPnfDetails().getPnfId();
776 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
777 getServiceData(siid, serviceDataBuilder);
779 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
780 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
782 // Set the serviceStatus based on input
783 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
784 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
787 // setup a service-data object builder
788 // ACTION pnf-topology-operation
790 // USES sdnc-request-header;
791 // USES request-information;
792 // USES service-information;
795 // USES pnf-topology-response-body;
797 // USES service-information
801 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
802 PnfTopologyOperationInputBuilder inputBuilder = new PnfTopologyOperationInputBuilder(input);
803 GenericResourceApiUtil.toProperties(properties, inputBuilder.build());
805 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
806 GenericResourceApiUtil.toProperties(properties, OPERATIONAL_DATA_PARAM, operDataBuilder);
808 // Call SLI sync method
810 ResponseObject responseObject = new ResponseObject("200", "");
811 String ackFinal = "Y";
812 String serviceObjectPath = null;
813 String pnfObjectPath = null;
814 Properties respProps = tryGetProperties(svcOperation, properties, serviceDataBuilder, responseObject);
816 if (respProps != null) {
817 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
818 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
819 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
821 pnfId = respProps.getProperty("pnfId");
823 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
824 pnfObjectPath = respProps.getProperty(PNF_OBJECT_PATH_PARAM);
827 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
828 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
829 serviceStatusBuilder.setRpcName(svcOperation);
831 if (failed(responseObject)) {
832 responseBuilder.setResponseCode(responseObject.getStatusCode());
833 responseBuilder.setResponseMessage(responseObject.getMessage());
834 responseBuilder.setAckFinalIndicator(ackFinal);
836 ServiceBuilder serviceBuilder = new ServiceBuilder();
837 serviceBuilder.setServiceInstanceId(siid);
838 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
840 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
841 trySaveService(input, serviceBuilder);
842 } catch (Exception e) {
843 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
845 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
847 RpcResult<PnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<PnfTopologyOperationOutput>status(true)
848 .withResult(responseBuilder.build()).build();
851 return Futures.immediateFuture(rpcResult);
854 // Got success from SLI
856 serviceData = serviceDataBuilder.build();
857 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
860 ServiceBuilder serviceBuilder = new ServiceBuilder();
861 serviceBuilder.setServiceData(serviceData);
862 serviceBuilder.setServiceInstanceId(siid);
863 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
864 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
866 if (isValidRequest(input) && input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)) {
867 // Only update operational tree on Assign
868 log.info(UPDATING_TREE_INFO_MESSAGE);
869 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
872 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
873 serviceResponseInformationBuilder.setInstanceId(siid);
874 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
875 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
877 PnfResponseInformationBuilder pnfResponseInformationBuilder = new PnfResponseInformationBuilder();
878 pnfResponseInformationBuilder.setInstanceId(pnfId);
879 pnfResponseInformationBuilder.setObjectPath(pnfObjectPath);
880 responseBuilder.setPnfResponseInformation(pnfResponseInformationBuilder.build());
882 } catch (Exception e) {
883 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
884 responseBuilder.setResponseCode("500");
885 responseBuilder.setResponseMessage(e.getMessage());
886 responseBuilder.setAckFinalIndicator("Y");
887 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
889 RpcResult<PnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<PnfTopologyOperationOutput>status(true)
890 .withResult(responseBuilder.build()).build();
892 return Futures.immediateFuture(rpcResult);
896 responseBuilder.setResponseCode(responseObject.getStatusCode());
897 responseBuilder.setAckFinalIndicator(ackFinal);
898 trySetResponseMessage(responseBuilder, responseObject);
899 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
900 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
902 RpcResult<PnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<PnfTopologyOperationOutput>status(true)
903 .withResult(responseBuilder.build()).build();
906 return Futures.immediateFuture(rpcResult);
909 private void trySetResponseMessage(PnfTopologyOperationOutputBuilder responseBuilder,
910 ResponseObject responseObject) {
911 if (responseObject.getMessage() != null) {
912 responseBuilder.setResponseMessage(responseObject.getMessage());
916 private void trySaveService(PnfTopologyOperationInput input, ServiceBuilder serviceBuilder) {
917 if (isValidRequest(input) && (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete)
918 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
920 // Only update operational tree on activate or delete
921 log.info(UPDATING_TREE_INFO_MESSAGE);
922 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
926 private boolean hasInvalidPnfId(PnfTopologyOperationInput input) {
927 return input.getPnfDetails() == null || input.getPnfDetails().getPnfId() == null
928 || input.getPnfDetails().getPnfId().length() == 0;
931 private boolean hasInvalidServiceId(PnfTopologyOperationInput input) {
932 return input == null || input.getServiceInformation() == null
933 || input.getServiceInformation().getServiceInstanceId() == null
934 || input.getServiceInformation().getServiceInstanceId().length() == 0;
937 private void trySetSvcRequestId(PnfTopologyOperationInput input,
938 PnfTopologyOperationOutputBuilder responseBuilder) {
939 if (input.getSdncRequestHeader() != null) {
940 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
944 private boolean isValidRequest(PnfTopologyOperationInput input) {
945 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
950 public ListenableFuture<RpcResult<VnfTopologyOperationOutput>> vnfTopologyOperation(
951 VnfTopologyOperationInput input) {
953 final String svcOperation = "vnf-topology-operation";
954 ServiceData serviceData;
955 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
956 Properties properties = new Properties();
958 log.info(CALLED_STR, svcOperation);
959 // create a new response object
960 VnfTopologyOperationOutputBuilder responseBuilder = new VnfTopologyOperationOutputBuilder();
962 if (hasInvalidServiceId(input)) {
963 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
964 responseBuilder.setResponseCode("404");
965 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
966 responseBuilder.setAckFinalIndicator("Y");
967 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<VnfTopologyOperationOutput>status(true)
968 .withResult(responseBuilder.build()).build();
970 return Futures.immediateFuture(rpcResult);
973 // Grab the service instance ID from the input buffer
974 String siid = input.getServiceInformation().getServiceInstanceId();
976 trySetSvcRequestId(input, responseBuilder);
978 /* Comment out mandatory check for vnf id for scenario wherein for assign/create request vnf-id is generated by
980 if (hasInvalidVnfId(input)) {
981 log.debug("exiting {} because of null or empty vnf-id", svcOperation);
982 responseBuilder.setResponseCode("404");
983 responseBuilder.setResponseMessage("invalid input, null or empty vnf-id");
984 responseBuilder.setAckFinalIndicator("Y");
986 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<VnfTopologyOperationOutput>status(true)
987 .withResult(responseBuilder.build()).build();
989 return Futures.immediateFuture(rpcResult);
993 String vnfId = input.getVnfInformation().getVnfId();
994 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
995 getServiceData(siid, serviceDataBuilder);
997 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
998 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
1000 // Set the serviceStatus based on input
1001 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
1002 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
1005 // setup a service-data object builder
1006 // ACTION vnf-topology-operation
1008 // USES sdnc-request-header;
1009 // USES request-information;
1010 // USES service-information;
1011 // USES vnf-request-information
1013 // USES vnf-topology-response-body;
1014 // USES vnf-information
1015 // USES service-information
1017 // container service-data
1018 // uses vnf-configuration-information;
1019 // uses oper-status;
1021 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
1022 VnfTopologyOperationInputBuilder inputBuilder = new VnfTopologyOperationInputBuilder(input);
1023 GenericResourceApiUtil.toProperties(properties, inputBuilder.build());
1025 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
1026 GenericResourceApiUtil.toProperties(properties, OPERATIONAL_DATA_PARAM, operDataBuilder);
1028 // Call SLI sync method
1030 ResponseObject responseObject = new ResponseObject("200", "");
1031 String ackFinal = "Y";
1032 String serviceObjectPath = null;
1033 String vnfObjectPath = null;
1034 String skipMdsalUpdate = null;
1035 Properties respProps = tryGetProperties(svcOperation, properties, serviceDataBuilder, responseObject);
1037 if (respProps != null) {
1038 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1039 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1040 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1041 if (vnfId == null) {
1042 vnfId = respProps.getProperty("vnfId");
1044 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1045 vnfObjectPath = respProps.getProperty(VNF_OBJECT_PATH_PARAM);
1046 skipMdsalUpdate = respProps.getProperty(SKIP_MDSAL_UPDATE_PROP);
1047 if (skipMdsalUpdate == null) {
1048 skipMdsalUpdate = "N";
1052 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
1053 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
1054 serviceStatusBuilder.setRpcName(svcOperation);
1056 if (failed(responseObject)) {
1057 responseBuilder.setResponseCode(responseObject.getStatusCode());
1058 responseBuilder.setResponseMessage(responseObject.getMessage());
1059 responseBuilder.setAckFinalIndicator(ackFinal);
1061 ServiceBuilder serviceBuilder = new ServiceBuilder();
1062 serviceBuilder.setServiceInstanceId(siid);
1063 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1065 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
1066 trySaveService(input, serviceBuilder);
1067 } catch (Exception e) {
1068 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1070 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1072 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<VnfTopologyOperationOutput>status(true)
1073 .withResult(responseBuilder.build()).build();
1076 return Futures.immediateFuture(rpcResult);
1079 // Got success from SLI
1081 if (skipMdsalUpdate.equals("N")) {
1082 serviceData = serviceDataBuilder.build();
1083 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
1086 ServiceBuilder serviceBuilder = new ServiceBuilder();
1087 serviceBuilder.setServiceData(serviceData);
1088 serviceBuilder.setServiceInstanceId(siid);
1089 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1090 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1092 if (isValidRequest(input) && input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)) {
1093 // Only update operational tree on Assign
1094 log.info(UPDATING_TREE_INFO_MESSAGE);
1095 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1098 // Even if we are skipping the MD-SAL update, update the service status object
1099 ServiceBuilder serviceBuilder = new ServiceBuilder();
1100 serviceBuilder.setServiceInstanceId(siid);
1101 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1102 Service service = serviceBuilder.build();
1103 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, service);
1104 saveService(service, true, LogicalDatastoreType.CONFIGURATION);
1107 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1108 serviceResponseInformationBuilder.setInstanceId(siid);
1109 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1110 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1112 VnfResponseInformationBuilder vnfResponseInformationBuilder = new VnfResponseInformationBuilder();
1113 vnfResponseInformationBuilder.setInstanceId(vnfId);
1114 vnfResponseInformationBuilder.setObjectPath(vnfObjectPath);
1115 responseBuilder.setVnfResponseInformation(vnfResponseInformationBuilder.build());
1117 } catch (Exception e) {
1118 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1119 responseBuilder.setResponseCode("500");
1120 responseBuilder.setResponseMessage(e.getMessage());
1121 responseBuilder.setAckFinalIndicator("Y");
1122 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1124 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<VnfTopologyOperationOutput>status(true)
1125 .withResult(responseBuilder.build()).build();
1127 return Futures.immediateFuture(rpcResult);
1131 responseBuilder.setResponseCode(responseObject.getStatusCode());
1132 responseBuilder.setAckFinalIndicator(ackFinal);
1133 trySetResponseMessage(responseBuilder, responseObject);
1134 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
1135 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
1137 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<VnfTopologyOperationOutput>status(true)
1138 .withResult(responseBuilder.build()).build();
1140 if (ackFinal.equals("N")) {
1141 // Spawn background thread to invoke the Async DG
1142 Runnable backgroundThread = new Runnable() {
1144 log.info(BACKGROUND_THREAD_STARTED_MESSAGE);
1145 processAsyncVnfTopologyOperation(input);
1148 new Thread(backgroundThread).start();
1152 return Futures.immediateFuture(rpcResult);
1155 private void trySetResponseMessage(VnfTopologyOperationOutputBuilder responseBuilder,
1156 ResponseObject responseObject) {
1157 if (responseObject.getMessage() != null) {
1158 responseBuilder.setResponseMessage(responseObject.getMessage());
1162 private void trySaveService(VnfTopologyOperationInput input, ServiceBuilder serviceBuilder) {
1163 if (isValidRequest(input) && (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete)
1164 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
1166 // Only update operational tree on activate or delete
1167 log.info(UPDATING_TREE_INFO_MESSAGE);
1168 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1172 private boolean hasInvalidVnfId(VnfTopologyOperationInput input) {
1173 return input.getVnfInformation() == null || input.getVnfInformation().getVnfId() == null
1174 || input.getVnfInformation().getVnfId().length() == 0;
1177 private boolean hasInvalidServiceId(VnfTopologyOperationInput input) {
1178 return input == null || input.getServiceInformation() == null
1179 || input.getServiceInformation().getServiceInstanceId() == null
1180 || input.getServiceInformation().getServiceInstanceId().length() == 0;
1183 private void trySetSvcRequestId(VnfTopologyOperationInput input,
1184 VnfTopologyOperationOutputBuilder responseBuilder) {
1185 if (input.getSdncRequestHeader() != null) {
1186 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1190 private boolean isValidRequest(VnfTopologyOperationInput input) {
1191 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
1194 public void processAsyncVnfTopologyOperation(VnfTopologyOperationInput input) {
1195 log.info(BACKGROUND_THREAD_INFO, input.getVnfInformation().getVnfId());
1197 final String svcOperation = "vnf-topology-operation-async";
1198 ServiceData serviceData = null;
1199 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1200 Properties parms = new Properties();
1202 log.info(CALLED_STR, svcOperation);
1204 // create a new response object (for logging purposes only)
1205 VnfTopologyOperationOutputBuilder responseBuilder = new VnfTopologyOperationOutputBuilder();
1207 // Grab the service instance ID from the input buffer
1208 String siid = input.getServiceInformation().getServiceInstanceId();
1209 String vnfId = input.getVnfInformation().getVnfId();
1211 trySetSvcRequestId(input, responseBuilder);
1213 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1214 getServiceData(siid, serviceDataBuilder);
1216 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
1217 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
1219 // Set the serviceStatus based on input
1220 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
1221 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
1224 // setup a service-data object builder
1225 // ACTION vnf-topology-operation
1227 // USES sdnc-request-header;
1228 // USES request-information;
1229 // USES service-information;
1230 // USES vnf-request-information
1232 // USES vnf-topology-response-body;
1233 // USES vnf-information
1234 // USES service-information
1236 // container service-data
1237 // uses vnf-configuration-information;
1238 // uses oper-status;
1240 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
1241 VnfTopologyOperationInputBuilder inputBuilder = new VnfTopologyOperationInputBuilder(input);
1242 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1244 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
1245 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
1247 // Call SLI sync method
1249 ResponseObject responseObject = new ResponseObject("200", "");
1250 String ackFinal = "Y";
1251 String serviceObjectPath = null;
1252 String vnfObjectPath = null;
1253 String skipMdsalUpdate = null;
1254 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
1256 if (respProps != null) {
1257 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1258 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1259 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1260 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1261 vnfObjectPath = respProps.getProperty(VNF_OBJECT_PATH_PARAM);
1262 skipMdsalUpdate = respProps.getProperty(SKIP_MDSAL_UPDATE_PROP);
1263 if (skipMdsalUpdate == null) {
1264 skipMdsalUpdate = "N";
1268 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
1269 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
1270 serviceStatusBuilder.setRpcName(svcOperation);
1272 if (failed(responseObject)) {
1273 responseBuilder.setResponseCode(responseObject.getStatusCode());
1274 responseBuilder.setResponseMessage(responseObject.getMessage());
1275 responseBuilder.setAckFinalIndicator(ackFinal);
1277 ServiceBuilder serviceBuilder = new ServiceBuilder();
1278 serviceBuilder.setServiceInstanceId(siid);
1279 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1281 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
1282 } catch (Exception e) {
1283 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1285 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1289 // Got success from SLI
1291 if (skipMdsalUpdate.equals("N")) {
1292 serviceData = serviceDataBuilder.build();
1293 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
1296 ServiceBuilder serviceBuilder = new ServiceBuilder();
1297 serviceBuilder.setServiceData(serviceData);
1298 serviceBuilder.setServiceInstanceId(siid);
1299 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1300 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1302 trySaveService(input, serviceBuilder);
1304 // Even if we are skipping the MD-SAL update, update the service status object
1305 ServiceBuilder serviceBuilder = new ServiceBuilder();
1306 serviceBuilder.setServiceInstanceId(siid);
1307 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1308 Service service = serviceBuilder.build();
1309 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, service);
1310 saveService(service, true, LogicalDatastoreType.CONFIGURATION);
1313 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1314 serviceResponseInformationBuilder.setInstanceId(siid);
1315 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1316 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1318 VnfResponseInformationBuilder vnfResponseInformationBuilder = new VnfResponseInformationBuilder();
1319 vnfResponseInformationBuilder.setInstanceId(vnfId);
1320 vnfResponseInformationBuilder.setObjectPath(vnfObjectPath);
1321 responseBuilder.setVnfResponseInformation(vnfResponseInformationBuilder.build());
1323 } catch (Exception e) {
1324 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1325 responseBuilder.setResponseCode("500");
1326 responseBuilder.setResponseMessage(e.getMessage());
1327 responseBuilder.setAckFinalIndicator("Y");
1328 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1334 responseBuilder.setResponseCode(responseObject.getStatusCode());
1335 responseBuilder.setAckFinalIndicator(ackFinal);
1336 trySetResponseMessage(responseBuilder, responseObject);
1337 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
1338 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
1343 public ListenableFuture<RpcResult<VfModuleTopologyOperationOutput>> vfModuleTopologyOperation(
1344 VfModuleTopologyOperationInput input) {
1346 final String svcOperation = "vf-module-topology-operation";
1347 ServiceData serviceData;
1348 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1349 Properties parms = new Properties();
1351 log.info(CALLED_STR, svcOperation);
1352 // create a new response object
1353 VfModuleTopologyOperationOutputBuilder responseBuilder = new VfModuleTopologyOperationOutputBuilder();
1355 if (hasInvalidServiceId(input)) {
1356 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
1357 responseBuilder.setResponseCode("403");
1358 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
1359 responseBuilder.setAckFinalIndicator("Y");
1361 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1362 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1365 return Futures.immediateFuture(rpcResult);
1368 if (hasInvalidVnfId(input)) {
1369 log.debug("exiting {} because of null or empty vnf-id", svcOperation);
1370 responseBuilder.setResponseCode("403");
1371 responseBuilder.setResponseMessage("invalid input, null or empty vnf-id");
1372 responseBuilder.setAckFinalIndicator("Y");
1373 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1374 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1375 return Futures.immediateFuture(rpcResult);
1378 /*if (hasInvalidVfModuleId(input)) {
1379 log.debug("exiting {} because of null or empty vf-module-id", svcOperation);
1380 responseBuilder.setResponseCode("403");
1381 responseBuilder.setResponseMessage("invalid input, vf-module-id is null or empty");
1382 responseBuilder.setAckFinalIndicator("Y");
1384 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1385 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1387 return Futures.immediateFuture(rpcResult);
1390 // Grab the service instance ID from the input buffer
1391 String siid = input.getServiceInformation().getServiceInstanceId();
1392 String vnfId = input.getVnfInformation().getVnfId();
1393 String vfModuleId = input.getVfModuleInformation().getVfModuleId();
1395 trySetSvcRequestId(input, responseBuilder);
1397 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1398 getServiceData(siid, serviceDataBuilder);
1400 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
1401 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
1403 // Set the serviceStatus based on input
1404 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
1405 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
1408 // setup a service-data object builder
1409 // ACTION vnf-topology-operation
1411 // USES sdnc-request-header;
1412 // USES request-information;
1413 // USES service-information;
1414 // USES vnf-request-information
1416 // USES vnf-topology-response-body;
1417 // USES vnf-information
1418 // USES service-information
1420 // container service-data
1421 // uses vnf-configuration-information;
1422 // uses oper-status;
1424 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
1425 VfModuleTopologyOperationInputBuilder inputBuilder = new VfModuleTopologyOperationInputBuilder(input);
1426 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1428 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
1429 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
1431 // Call SLI sync method
1433 ResponseObject responseObject = new ResponseObject("200", "");
1434 String ackFinal = "Y";
1435 String serviceObjectPath = null;
1436 String vnfObjectPath = null;
1437 String vfModuleObjectPath = null;
1438 String skipMdsalUpdate = null;
1439 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
1441 if (respProps != null) {
1442 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1443 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1444 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1445 if (vfModuleId == null) {
1446 vfModuleId = respProps.getProperty(VF_MODULE_ID_PARAM);
1447 if (vfModuleId == null) {
1448 log.debug("exiting {} because vf-module-id not found in response", svcOperation);
1449 responseBuilder.setResponseCode("403");
1450 responseBuilder.setResponseMessage("failed to generate vf-module-id");
1451 responseBuilder.setAckFinalIndicator("Y");
1453 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1454 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1456 return Futures.immediateFuture(rpcResult);
1459 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1460 vnfObjectPath = respProps.getProperty(VNF_OBJECT_PATH_PARAM);
1461 vfModuleObjectPath = respProps.getProperty(VF_MODULE_OBJECT_PATH_PARAM);
1462 skipMdsalUpdate = respProps.getProperty(SKIP_MDSAL_UPDATE_PROP);
1463 if (skipMdsalUpdate == null) {
1464 skipMdsalUpdate = "N";
1468 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
1469 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
1470 serviceStatusBuilder.setRpcName(svcOperation);
1472 if (failed(responseObject)) {
1473 responseBuilder.setResponseCode(responseObject.getStatusCode());
1474 responseBuilder.setResponseMessage(responseObject.getMessage());
1475 responseBuilder.setAckFinalIndicator(ackFinal);
1477 ServiceBuilder serviceBuilder = new ServiceBuilder();
1478 serviceBuilder.setServiceInstanceId(siid);
1479 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1481 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
1482 } catch (Exception e) {
1483 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1485 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1487 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1488 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1491 return Futures.immediateFuture(rpcResult);
1494 // Got success from SLI
1496 if (skipMdsalUpdate.equals("N")) {
1497 serviceData = serviceDataBuilder.build();
1498 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
1501 ServiceBuilder serviceBuilder = new ServiceBuilder();
1502 serviceBuilder.setServiceData(serviceData);
1503 serviceBuilder.setServiceInstanceId(siid);
1504 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1505 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1507 trySaveService(input, serviceBuilder);
1509 // Even if we are skipping the MD-SAL update, update the service status object
1510 ServiceBuilder serviceBuilder = new ServiceBuilder();
1511 serviceBuilder.setServiceInstanceId(siid);
1512 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1513 Service service = serviceBuilder.build();
1514 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, service);
1515 saveService(service, true, LogicalDatastoreType.CONFIGURATION);
1518 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1519 serviceResponseInformationBuilder.setInstanceId(siid);
1520 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1521 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1523 VnfResponseInformationBuilder vnfResponseInformationBuilder = new VnfResponseInformationBuilder();
1524 vnfResponseInformationBuilder.setInstanceId(vnfId);
1525 vnfResponseInformationBuilder.setObjectPath(vnfObjectPath);
1526 responseBuilder.setVnfResponseInformation(vnfResponseInformationBuilder.build());
1528 VfModuleResponseInformationBuilder vfModuleResponseInformationBuilder = new VfModuleResponseInformationBuilder();
1529 vfModuleResponseInformationBuilder.setInstanceId(vfModuleId);
1530 vfModuleResponseInformationBuilder.setObjectPath(vfModuleObjectPath);
1531 responseBuilder.setVfModuleResponseInformation(vfModuleResponseInformationBuilder.build());
1533 } catch (Exception e) {
1534 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1535 responseBuilder.setResponseCode("500");
1536 responseBuilder.setResponseMessage(e.getMessage());
1537 responseBuilder.setAckFinalIndicator("Y");
1538 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1540 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1541 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1543 return Futures.immediateFuture(rpcResult);
1547 responseBuilder.setResponseCode(responseObject.getStatusCode());
1548 responseBuilder.setAckFinalIndicator(ackFinal);
1549 trySetResponseMessage(responseBuilder, responseObject);
1550 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
1551 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
1553 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1554 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1556 if (ackFinal.equals("N")) {
1557 // Spawn background thread to invoke the Async DG
1558 Runnable backgroundThread = new Runnable() {
1560 log.info(BACKGROUND_THREAD_STARTED_MESSAGE);
1561 processAsyncVfModuleTopologyOperation(input);
1564 new Thread(backgroundThread).start();
1568 return Futures.immediateFuture(rpcResult);
1571 private void trySetResponseMessage(VfModuleTopologyOperationOutputBuilder responseBuilder,
1572 ResponseObject responseObject) {
1573 if (responseObject.getMessage() != null) {
1574 responseBuilder.setResponseMessage(responseObject.getMessage());
1578 private void trySaveService(VfModuleTopologyOperationInput input, ServiceBuilder serviceBuilder) {
1579 if (isValidRequest(input) && (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign)
1580 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
1581 // Only update operational tree on activate or delete
1583 log.info(UPDATING_TREE_INFO_MESSAGE);
1584 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1588 private void trySetSvcRequestId(VfModuleTopologyOperationInput input,
1589 VfModuleTopologyOperationOutputBuilder responseBuilder) {
1590 if (input.getSdncRequestHeader() != null) {
1591 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1595 private boolean hasInvalidVfModuleId(VfModuleTopologyOperationInput input) {
1596 return input.getVfModuleInformation() == null || input.getVfModuleInformation().getVfModuleId() == null
1597 || input.getVfModuleInformation().getVfModuleId().length() == 0;
1600 private boolean hasInvalidVnfId(VfModuleTopologyOperationInput input) {
1601 return input.getVnfInformation() == null || input.getVnfInformation().getVnfId() == null
1602 || input.getVnfInformation().getVnfId().length() == 0;
1605 private boolean hasInvalidServiceId(VfModuleTopologyOperationInput input) {
1606 return input == null || input.getServiceInformation() == null
1607 || input.getServiceInformation().getServiceInstanceId() == null
1608 || input.getServiceInformation().getServiceInstanceId().length() == 0;
1611 private boolean isValidRequest(VfModuleTopologyOperationInput input) {
1612 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
1615 public void processAsyncVfModuleTopologyOperation(VfModuleTopologyOperationInput input) {
1616 log.info(BACKGROUND_THREAD_INFO, input.getVfModuleInformation().getVfModuleId());
1618 final String svcOperation = "vf-module-topology-operation-async";
1619 ServiceData serviceData = null;
1620 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1621 Properties parms = new Properties();
1623 log.info(CALLED_STR, svcOperation);
1625 // create a new response object (for logging purposes only)
1626 VfModuleTopologyOperationOutputBuilder responseBuilder = new VfModuleTopologyOperationOutputBuilder();
1628 // Grab the service instance ID from the input buffer
1629 String siid = input.getServiceInformation().getServiceInstanceId();
1630 String vnfId = input.getVnfInformation().getVnfId();
1631 String vfModuleId = input.getVfModuleInformation().getVfModuleId();
1633 trySetSvcRequestId(input, responseBuilder);
1635 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1636 getServiceData(siid, serviceDataBuilder);
1638 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
1639 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
1641 // Set the serviceStatus based on input
1642 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
1643 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
1646 // setup a service-data object builder
1647 // ACTION vnf-topology-operation
1649 // USES sdnc-request-header;
1650 // USES request-information;
1651 // USES service-information;
1652 // USES vnf-request-information
1654 // USES vnf-topology-response-body;
1655 // USES vnf-information
1656 // USES service-information
1658 // container service-data
1659 // uses vnf-configuration-information;
1660 // uses oper-status;
1662 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
1663 VfModuleTopologyOperationInputBuilder inputBuilder = new VfModuleTopologyOperationInputBuilder(input);
1664 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1666 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
1667 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
1669 // Call SLI sync method
1671 ResponseObject responseObject = new ResponseObject("200", "");
1672 String ackFinal = "Y";
1673 String serviceObjectPath = null;
1674 String vnfObjectPath = null;
1675 String vfModuleObjectPath = null;
1676 String skipMdsalUpdate = null;
1677 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
1679 if (respProps != null) {
1680 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1681 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1682 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1683 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1684 vnfObjectPath = respProps.getProperty(VNF_OBJECT_PATH_PARAM);
1685 vfModuleObjectPath = respProps.getProperty(VF_MODULE_OBJECT_PATH_PARAM);
1686 skipMdsalUpdate = respProps.getProperty(SKIP_MDSAL_UPDATE_PROP);
1687 if (skipMdsalUpdate == null) {
1688 skipMdsalUpdate = "N";
1692 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
1693 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
1694 serviceStatusBuilder.setRpcName(svcOperation);
1696 if (failed(responseObject)) {
1697 responseBuilder.setResponseCode(responseObject.getStatusCode());
1698 responseBuilder.setResponseMessage(responseObject.getMessage());
1699 responseBuilder.setAckFinalIndicator(ackFinal);
1701 ServiceBuilder serviceBuilder = new ServiceBuilder();
1702 serviceBuilder.setServiceInstanceId(siid);
1703 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1705 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
1706 } catch (Exception e) {
1707 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1709 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1713 // Got success from SLI
1715 if (skipMdsalUpdate.equals("N")) {
1716 serviceData = serviceDataBuilder.build();
1717 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
1720 ServiceBuilder serviceBuilder = new ServiceBuilder();
1721 serviceBuilder.setServiceData(serviceData);
1722 serviceBuilder.setServiceInstanceId(siid);
1723 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1724 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1726 trySaveService(input, serviceBuilder);
1728 // Even if we are skipping the MD-SAL update, update the service status object
1729 ServiceBuilder serviceBuilder = new ServiceBuilder();
1730 serviceBuilder.setServiceInstanceId(siid);
1731 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1732 Service service = serviceBuilder.build();
1733 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, service);
1734 saveService(service, true, LogicalDatastoreType.CONFIGURATION);
1737 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1738 serviceResponseInformationBuilder.setInstanceId(siid);
1739 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1740 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1742 VnfResponseInformationBuilder vnfResponseInformationBuilder = new VnfResponseInformationBuilder();
1743 vnfResponseInformationBuilder.setInstanceId(vnfId);
1744 vnfResponseInformationBuilder.setObjectPath(vnfObjectPath);
1745 responseBuilder.setVnfResponseInformation(vnfResponseInformationBuilder.build());
1747 VfModuleResponseInformationBuilder vfModuleResponseInformationBuilder = new VfModuleResponseInformationBuilder();
1748 vfModuleResponseInformationBuilder.setInstanceId(vfModuleId);
1749 vfModuleResponseInformationBuilder.setObjectPath(vfModuleObjectPath);
1750 responseBuilder.setVfModuleResponseInformation(vfModuleResponseInformationBuilder.build());
1752 } catch (Exception e) {
1753 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1754 responseBuilder.setResponseCode("500");
1755 responseBuilder.setResponseMessage(e.getMessage());
1756 responseBuilder.setAckFinalIndicator("Y");
1757 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1763 responseBuilder.setResponseCode(responseObject.getStatusCode());
1764 responseBuilder.setAckFinalIndicator(ackFinal);
1765 trySetResponseMessage(responseBuilder, responseObject);
1766 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
1767 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
1772 public ListenableFuture<RpcResult<NetworkTopologyOperationOutput>> networkTopologyOperation(
1773 NetworkTopologyOperationInput input) {
1775 final String svcOperation = "network-topology-operation";
1776 ServiceData serviceData;
1777 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1778 Properties parms = new Properties();
1780 log.info(CALLED_STR, svcOperation);
1781 // create a new response object
1782 NetworkTopologyOperationOutputBuilder responseBuilder = new NetworkTopologyOperationOutputBuilder();
1784 if (hasInvalidServiceId(input)) {
1785 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
1786 return buildRpcResultFuture(responseBuilder, NULL_OR_EMPTY_ERROR_PARAM);
1789 String siid = input.getServiceInformation().getServiceInstanceId();
1791 // Get the service-instance service data from MD-SAL
1792 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1793 getServiceData(siid, serviceDataBuilder);
1795 this.trySetSvcRequestId(input, responseBuilder);
1797 ServiceData sd = serviceDataBuilder.build();
1798 if (isInvalidServiceData(sd)) {
1799 log.debug(EMPTY_SERVICE_INSTANCE_MESSAGE, svcOperation);
1800 return buildRpcResultFuture(responseBuilder, INVALID_INPUT_ERROR_MESSAGE);
1803 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
1804 NetworkTopologyOperationInputBuilder inputBuilder = new NetworkTopologyOperationInputBuilder(input);
1805 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1807 // Call SLI sync method
1809 ResponseObject responseObject = new ResponseObject("200", "");
1810 String ackFinal = "Y";
1811 String networkId = ERROR_NETWORK_ID;
1812 String serviceObjectPath = null;
1813 String networkObjectPath = null;
1814 String skipMdsalUpdate = null;
1815 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
1817 if (respProps != null) {
1818 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1819 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1820 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1821 networkId = respProps.getProperty("networkId");
1822 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1823 networkObjectPath = respProps.getProperty(NETWORK_OBJECT_PATH_PARAM);
1824 skipMdsalUpdate = respProps.getProperty(SKIP_MDSAL_UPDATE_PROP);
1825 if (skipMdsalUpdate == null) {
1826 skipMdsalUpdate = "N";
1830 if (failed(responseObject)) {
1831 responseBuilder.setResponseCode(responseObject.getStatusCode());
1832 responseBuilder.setResponseMessage(responseObject.getMessage());
1833 responseBuilder.setAckFinalIndicator(ackFinal);
1835 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1837 RpcResult<NetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
1838 .<NetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1840 return Futures.immediateFuture(rpcResult);
1843 // Got success from SLI
1845 if (skipMdsalUpdate.equals("N")) {
1846 serviceData = serviceDataBuilder.build();
1847 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
1850 ServiceBuilder serviceBuilder = new ServiceBuilder();
1851 serviceBuilder.setServiceData(serviceData);
1852 serviceBuilder.setServiceInstanceId(siid);
1853 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1854 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1856 trySaveService(input, serviceBuilder);
1858 // Even if we are skipping the MD-SAL update, update the service status object
1859 ServiceBuilder serviceBuilder = new ServiceBuilder();
1860 serviceBuilder.setServiceInstanceId(siid);
1861 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1862 Service service = serviceBuilder.build();
1863 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, service);
1864 saveService(service, true, LogicalDatastoreType.CONFIGURATION);
1867 NetworkResponseInformationBuilder networkResponseInformationBuilder = new NetworkResponseInformationBuilder();
1868 networkResponseInformationBuilder.setInstanceId(networkId);
1869 networkResponseInformationBuilder.setObjectPath(networkObjectPath);
1870 responseBuilder.setNetworkResponseInformation(networkResponseInformationBuilder.build());
1872 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1873 serviceResponseInformationBuilder.setInstanceId(siid);
1874 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1875 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1876 } catch (IllegalStateException e) {
1877 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1878 responseBuilder.setResponseCode("500");
1879 responseBuilder.setResponseMessage(e.getMessage());
1880 responseBuilder.setAckFinalIndicator("Y");
1881 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1883 RpcResult<NetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
1884 .<NetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1886 return Futures.immediateFuture(rpcResult);
1890 responseBuilder.setResponseCode(responseObject.getStatusCode());
1891 responseBuilder.setAckFinalIndicator(ackFinal);
1892 trySetResponseMessage(responseBuilder, responseObject);
1893 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
1894 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
1896 RpcResult<NetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
1897 .<NetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1899 return Futures.immediateFuture(rpcResult);
1902 private void trySetResponseMessage(NetworkTopologyOperationOutputBuilder responseBuilder,
1903 ResponseObject responseObject) {
1904 if (responseObject.getMessage() != null) {
1905 responseBuilder.setResponseMessage(responseObject.getMessage());
1909 private void trySetSvcRequestId(NetworkTopologyOperationInput input,
1910 NetworkTopologyOperationOutputBuilder responseBuilder) {
1911 if (input.getSdncRequestHeader() != null) {
1912 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1916 private void trySaveService(NetworkTopologyOperationInput input, ServiceBuilder serviceBuilder) {
1917 if (isValidRequest(input) && (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)
1918 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Create))) {
1919 // Only update operational tree on Activate
1920 log.info(UPDATING_TREE_INFO_MESSAGE);
1921 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1925 private boolean hasInvalidServiceId(NetworkTopologyOperationInput input) {
1926 return input == null || input.getServiceInformation() == null
1927 || input.getServiceInformation().getServiceInstanceId() == null
1928 || input.getServiceInformation().getServiceInstanceId().length() == 0;
1931 private ListenableFuture<RpcResult<NetworkTopologyOperationOutput>> buildRpcResultFuture(
1932 NetworkTopologyOperationOutputBuilder responseBuilder, String responseMessage) {
1934 responseBuilder.setResponseCode("404");
1935 responseBuilder.setResponseMessage(responseMessage);
1936 responseBuilder.setAckFinalIndicator("Y");
1938 RpcResult<NetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
1939 .<NetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1941 return Futures.immediateFuture(rpcResult);
1944 private boolean isValidRequest(NetworkTopologyOperationInput input) {
1945 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
1949 public ListenableFuture<RpcResult<ContrailRouteTopologyOperationOutput>> contrailRouteTopologyOperation(
1950 ContrailRouteTopologyOperationInput input) {
1952 final String svcOperation = "contrail-route-topology-operation";
1953 ServiceData serviceData;
1954 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1955 Properties properties = new Properties();
1957 log.info(CALLED_STR, svcOperation);
1958 // create a new response object
1959 ContrailRouteTopologyOperationOutputBuilder responseBuilder = new ContrailRouteTopologyOperationOutputBuilder();
1961 if (hasInvalidServiceId(input)) {
1962 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
1963 return buildRpcResultFuture(responseBuilder, NULL_OR_EMPTY_ERROR_PARAM);
1966 String siid = input.getServiceInformation().getServiceInstanceId();
1968 // Get the service-instance service data from MD-SAL
1969 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1970 getServiceData(siid, serviceDataBuilder);
1972 trySetSvcRequestId(input, responseBuilder);
1974 ServiceData sd = serviceDataBuilder.build();
1975 if (isInvalidServiceData(sd)) {
1976 log.debug(EMPTY_SERVICE_INSTANCE_MESSAGE, svcOperation);
1977 return buildRpcResultFuture(responseBuilder, INVALID_INPUT_ERROR_MESSAGE);
1980 log.info("Adding INPUT data for " + svcOperation + " [" + siid + "] input: " + input);
1981 ContrailRouteTopologyOperationInputBuilder inputBuilder = new ContrailRouteTopologyOperationInputBuilder(input);
1982 GenericResourceApiUtil.toProperties(properties, inputBuilder.build());
1984 // Call SLI sync method
1986 ResponseObject responseObject = new ResponseObject("200", "");
1987 String ackFinal = "Y";
1988 String allottedResourceId = ERROR_NETWORK_ID;
1989 String serviceObjectPath = null;
1990 String contrailRouteObjectPath = null;
1991 Properties respProps = tryGetProperties(svcOperation, properties, serviceDataBuilder, responseObject);
1993 if (respProps != null) {
1994 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1995 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1996 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1997 allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
1998 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1999 contrailRouteObjectPath = respProps.getProperty("contrail-route-object-path");
2002 if (failed(responseObject)) {
2003 responseBuilder.setResponseCode(responseObject.getStatusCode());
2004 responseBuilder.setResponseMessage(responseObject.getMessage());
2005 responseBuilder.setAckFinalIndicator(ackFinal);
2006 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2008 RpcResult<ContrailRouteTopologyOperationOutput> rpcResult = RpcResultBuilder
2009 .<ContrailRouteTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2011 return Futures.immediateFuture(rpcResult);
2014 // Got success from SLI
2016 serviceData = serviceDataBuilder.build();
2017 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
2020 ServiceBuilder serviceBuilder = new ServiceBuilder();
2021 serviceBuilder.setServiceData(serviceData);
2022 serviceBuilder.setServiceInstanceId(siid);
2023 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
2024 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
2026 trySaveService(input, serviceBuilder);
2028 ContrailRouteResponseInformationBuilder contrailRouteResponseInformationBuilder = new ContrailRouteResponseInformationBuilder();
2029 contrailRouteResponseInformationBuilder.setInstanceId(allottedResourceId);
2030 contrailRouteResponseInformationBuilder.setObjectPath(contrailRouteObjectPath);
2031 responseBuilder.setContrailRouteResponseInformation(contrailRouteResponseInformationBuilder.build());
2033 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
2034 serviceResponseInformationBuilder.setInstanceId(siid);
2035 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
2036 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
2038 } catch (IllegalStateException e) {
2039 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
2040 responseBuilder.setResponseCode("500");
2041 responseBuilder.setResponseMessage(e.getMessage());
2042 responseBuilder.setAckFinalIndicator("Y");
2043 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2045 RpcResult<ContrailRouteTopologyOperationOutput> rpcResult = RpcResultBuilder
2046 .<ContrailRouteTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2048 return Futures.immediateFuture(rpcResult);
2052 responseBuilder.setResponseCode(responseObject.getStatusCode());
2053 responseBuilder.setAckFinalIndicator(ackFinal);
2054 trySetResponseMessage(responseBuilder, responseObject);
2055 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
2056 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
2058 RpcResult<ContrailRouteTopologyOperationOutput> rpcResult = RpcResultBuilder
2059 .<ContrailRouteTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2061 return Futures.immediateFuture(rpcResult);
2064 private void trySetResponseMessage(ContrailRouteTopologyOperationOutputBuilder responseBuilder,
2065 ResponseObject responseObject) {
2066 if (responseObject.getMessage() != null) {
2067 responseBuilder.setResponseMessage(responseObject.getMessage());
2071 private void trySaveService(ContrailRouteTopologyOperationInput input, ServiceBuilder serviceBuilder) {
2072 if (isValidRequest(input) && (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign)
2073 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
2074 // Only update operational tree on activate or delete
2075 log.info(UPDATING_TREE_INFO_MESSAGE);
2076 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
2080 private void trySetSvcRequestId(ContrailRouteTopologyOperationInput input,
2081 ContrailRouteTopologyOperationOutputBuilder responseBuilder) {
2082 if (input.getSdncRequestHeader() != null) {
2083 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
2087 private boolean hasInvalidServiceId(ContrailRouteTopologyOperationInput input) {
2088 return input == null || input.getServiceInformation() == null
2089 || input.getServiceInformation().getServiceInstanceId() == null
2090 || input.getServiceInformation().getServiceInstanceId().length() == 0;
2093 private ListenableFuture<RpcResult<ContrailRouteTopologyOperationOutput>> buildRpcResultFuture(
2094 ContrailRouteTopologyOperationOutputBuilder responseBuilder, String responseMessage) {
2095 responseBuilder.setResponseCode("404");
2096 responseBuilder.setResponseMessage(responseMessage);
2097 responseBuilder.setAckFinalIndicator("Y");
2099 RpcResult<ContrailRouteTopologyOperationOutput> rpcResult = RpcResultBuilder
2100 .<ContrailRouteTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2102 return Futures.immediateFuture(rpcResult);
2105 private boolean isValidRequest(ContrailRouteTopologyOperationInput input) {
2106 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
2110 public ListenableFuture<RpcResult<SecurityZoneTopologyOperationOutput>> securityZoneTopologyOperation(
2111 SecurityZoneTopologyOperationInput input) {
2113 final String svcOperation = "security-zone-topology-operation";
2114 ServiceData serviceData;
2115 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
2116 Properties parms = new Properties();
2118 log.info(CALLED_STR, svcOperation);
2119 // create a new response object
2120 SecurityZoneTopologyOperationOutputBuilder responseBuilder = new SecurityZoneTopologyOperationOutputBuilder();
2122 if (this.hasInvalidServiceId(input)) {
2123 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
2124 return buildRpcResultFuture(responseBuilder, NULL_OR_EMPTY_ERROR_PARAM);
2127 String siid = input.getServiceInformation().getServiceInstanceId();
2129 // Get the service-instance service data from MD-SAL
2130 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
2131 getServiceData(siid, serviceDataBuilder);
2132 trySetSvcRequestId(input, responseBuilder);
2134 ServiceData sd = serviceDataBuilder.build();
2135 if (isInvalidServiceData(sd)) {
2136 log.debug(EMPTY_SERVICE_INSTANCE_MESSAGE, svcOperation);
2137 return buildRpcResultFuture(responseBuilder, INVALID_INPUT_ERROR_MESSAGE);
2140 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
2141 SecurityZoneTopologyOperationInputBuilder inputBuilder = new SecurityZoneTopologyOperationInputBuilder(input);
2142 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
2144 // Call SLI sync method
2146 Properties respProps = null;
2148 ResponseObject responseObject = new ResponseObject("200", "");
2149 String ackFinal = "Y";
2150 String allottedResourceId = ERROR_NETWORK_ID;
2151 String serviceObjectPath = null;
2152 String securityZoneObjectPath = null;
2155 if (svcLogicClient.hasGraph(APP_NAME, svcOperation, null, "sync")) {
2158 respProps = svcLogicClient.execute(APP_NAME, svcOperation, null, "sync", serviceDataBuilder, parms);
2159 } catch (Exception e) {
2160 log.error(SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE, svcOperation, e);
2161 responseObject.setMessage(e.getMessage());
2162 responseObject.setStatusCode("500");
2165 responseObject.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
2166 responseObject.setStatusCode("503");
2168 } catch (Exception e) {
2169 responseObject.setStatusCode("500");
2170 responseObject.setMessage(e.getMessage());
2171 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
2174 if (respProps != null) {
2175 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2176 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2177 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2178 allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
2179 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
2180 securityZoneObjectPath = respProps.getProperty("security-zone-object-path");
2183 if (failed(responseObject)) {
2184 responseBuilder.setResponseCode(responseObject.getStatusCode());
2185 responseBuilder.setResponseMessage(responseObject.getMessage());
2186 responseBuilder.setAckFinalIndicator(ackFinal);
2187 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2189 RpcResult<SecurityZoneTopologyOperationOutput> rpcResult = RpcResultBuilder
2190 .<SecurityZoneTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2192 return Futures.immediateFuture(rpcResult);
2195 // Got success from SLI
2198 serviceData = serviceDataBuilder.build();
2199 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
2202 ServiceBuilder serviceBuilder = new ServiceBuilder();
2203 serviceBuilder.setServiceData(serviceData);
2204 serviceBuilder.setServiceInstanceId(siid);
2205 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
2206 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
2208 trySaveService(input, serviceBuilder);
2210 SecurityZoneResponseInformationBuilder securityZoneResponseInformationBuilder = new SecurityZoneResponseInformationBuilder();
2211 securityZoneResponseInformationBuilder.setInstanceId(allottedResourceId);
2212 securityZoneResponseInformationBuilder.setObjectPath(securityZoneObjectPath);
2213 responseBuilder.setSecurityZoneResponseInformation(securityZoneResponseInformationBuilder.build());
2215 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
2216 serviceResponseInformationBuilder.setInstanceId(siid);
2217 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
2218 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
2220 } catch (IllegalStateException e) {
2221 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
2222 responseBuilder.setResponseCode("500");
2223 responseBuilder.setResponseMessage(e.getMessage());
2224 responseBuilder.setAckFinalIndicator("Y");
2225 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2227 RpcResult<SecurityZoneTopologyOperationOutput> rpcResult = RpcResultBuilder
2228 .<SecurityZoneTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2230 return Futures.immediateFuture(rpcResult);
2234 responseBuilder.setResponseCode(responseObject.getStatusCode());
2235 responseBuilder.setAckFinalIndicator(ackFinal);
2236 trySetResponseMessage(responseBuilder, responseObject);
2237 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
2238 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
2240 RpcResult<SecurityZoneTopologyOperationOutput> rpcResult = RpcResultBuilder
2241 .<SecurityZoneTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2243 return Futures.immediateFuture(rpcResult);
2246 private void trySetResponseMessage(SecurityZoneTopologyOperationOutputBuilder responseBuilder,
2247 ResponseObject responseObject) {
2248 if (responseObject.getMessage() != null) {
2249 responseBuilder.setResponseMessage(responseObject.getMessage());
2253 private void trySaveService(SecurityZoneTopologyOperationInput input, ServiceBuilder serviceBuilder) {
2254 if (isValidRequest(input) && (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign)
2255 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
2256 // Only update operational tree on activate or delete
2257 log.info(UPDATING_TREE_INFO_MESSAGE);
2258 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
2262 private void trySetSvcRequestId(SecurityZoneTopologyOperationInput input,
2263 SecurityZoneTopologyOperationOutputBuilder responseBuilder) {
2264 if (input.getSdncRequestHeader() != null) {
2265 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
2269 private boolean isInvalidServiceData(ServiceData sd) {
2270 return sd == null || sd.getServiceLevelOperStatus() == null;
2273 private boolean hasInvalidServiceId(SecurityZoneTopologyOperationInput input) {
2274 return input == null || input.getServiceInformation() == null
2275 || input.getServiceInformation().getServiceInstanceId() == null
2276 || input.getServiceInformation().getServiceInstanceId().length() == 0;
2279 private ListenableFuture<RpcResult<SecurityZoneTopologyOperationOutput>> buildRpcResultFuture(
2280 SecurityZoneTopologyOperationOutputBuilder responseBuilder, String responseMessage) {
2282 responseBuilder.setResponseCode("404");
2283 responseBuilder.setResponseMessage(responseMessage);
2284 responseBuilder.setAckFinalIndicator("Y");
2286 RpcResult<SecurityZoneTopologyOperationOutput> rpcResult = RpcResultBuilder
2287 .<SecurityZoneTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2289 return Futures.immediateFuture(rpcResult);
2292 private boolean isValidRequest(SecurityZoneTopologyOperationInput input) {
2293 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
2297 private boolean hasInvalidServiceId(ConnectionAttachmentTopologyOperationInput input) {
2298 return input == null || input.getServiceInformation() == null
2299 || input.getServiceInformation().getServiceInstanceId() == null
2300 || input.getServiceInformation().getServiceInstanceId().length() == 0;
2303 private void trySetResponseMessage(ConnectionAttachmentTopologyOperationOutputBuilder responseBuilder,
2304 ResponseObject error) {
2305 if (!error.getMessage().isEmpty()) {
2306 responseBuilder.setResponseMessage(error.getMessage());
2310 private void trySetSvcRequestId(ConnectionAttachmentTopologyOperationInput input,
2311 ConnectionAttachmentTopologyOperationOutputBuilder responseBuilder) {
2312 if (input.getSdncRequestHeader() != null) {
2313 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
2317 private ListenableFuture<RpcResult<ConnectionAttachmentTopologyOperationOutput>>
2318 buildRpcResultFuture(ConnectionAttachmentTopologyOperationOutputBuilder responseBuilder, String responseMessage) {
2320 responseBuilder.setResponseCode("404");
2321 responseBuilder.setResponseMessage(responseMessage);
2322 responseBuilder.setAckFinalIndicator("Y");
2324 RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
2325 .<ConnectionAttachmentTopologyOperationOutput>status(true)
2326 .withResult(responseBuilder.build())
2329 return Futures.immediateFuture(rpcResult);
2332 private void trySaveService(ConnectionAttachmentTopologyOperationInput input, ServiceBuilder serviceBuilder) {
2333 if (isValidRequest(input) &&
2334 (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign) ||
2335 input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
2336 // Only update operational tree on activate or delete
2337 log.info(UPDATING_TREE_INFO_MESSAGE);
2338 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
2342 private boolean isValidRequest(ConnectionAttachmentTopologyOperationInput input) {
2343 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
2347 public ListenableFuture<RpcResult<ConnectionAttachmentTopologyOperationOutput>> connectionAttachmentTopologyOperation(
2348 ConnectionAttachmentTopologyOperationInput input) {
2349 final String svcOperation = "connection-attachment-topology-operation";
2350 Properties parms = new Properties();
2351 log.info(CALLED_STR, svcOperation);
2353 // create a new response object
2354 ConnectionAttachmentTopologyOperationOutputBuilder responseBuilder = new ConnectionAttachmentTopologyOperationOutputBuilder();
2355 if (hasInvalidServiceId(input)) {
2356 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
2357 responseBuilder.setResponseCode("404");
2358 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
2359 responseBuilder.setAckFinalIndicator("Y");
2361 RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
2362 .<ConnectionAttachmentTopologyOperationOutput>status(true)
2363 .withResult(responseBuilder.build())
2366 return Futures.immediateFuture(rpcResult);
2369 ServiceData serviceData;
2370 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
2372 String siid = input.getServiceInformation().getServiceInstanceId();
2373 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
2375 // Get the service-instance service data from MD-SAL
2376 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
2377 getServiceData(siid, serviceDataBuilder);
2379 trySetSvcRequestId(input, responseBuilder);
2381 ServiceData sd = serviceDataBuilder.build();
2382 if (isInvalidServiceData(sd)) {
2383 log.debug(EMPTY_SERVICE_INSTANCE_MESSAGE, svcOperation);
2384 return buildRpcResultFuture(responseBuilder, INVALID_INPUT_ERROR_MESSAGE);
2387 ConnectionAttachmentTopologyOperationInputBuilder inputBuilder = new ConnectionAttachmentTopologyOperationInputBuilder(
2389 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
2391 // Call SLI sync method
2392 // Get SvcLogicService reference
2393 ResponseObject responseObject = new ResponseObject("200", "");
2394 String ackFinal = "Y";
2395 String allottedResourceId = ERROR_NETWORK_ID;
2396 String serviceObjectPath = null;
2397 String connectionAttachmentObjectPath = null;
2399 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
2401 if (respProps != null) {
2402 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2403 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2404 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2405 allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
2406 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
2407 connectionAttachmentObjectPath = respProps.getProperty("connection-attachment-object-path");
2410 if (failed(responseObject)) {
2411 responseBuilder.setResponseCode(responseObject.getStatusCode());
2412 responseBuilder.setResponseMessage(responseObject.getMessage());
2413 responseBuilder.setAckFinalIndicator(ackFinal);
2415 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2417 RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
2418 .<ConnectionAttachmentTopologyOperationOutput>status(true)
2419 .withResult(responseBuilder.build())
2422 return Futures.immediateFuture(rpcResult);
2425 // Got success from SLI
2428 serviceData = serviceDataBuilder.build();
2429 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
2432 ServiceBuilder serviceBuilder = new ServiceBuilder();
2433 serviceBuilder.setServiceData(serviceData);
2434 serviceBuilder.setServiceInstanceId(siid);
2435 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
2436 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
2438 trySaveService(input, serviceBuilder);
2440 ConnectionAttachmentResponseInformationBuilder connectionAttachmentResponseInformationBuilder = new ConnectionAttachmentResponseInformationBuilder();
2441 connectionAttachmentResponseInformationBuilder.setInstanceId(allottedResourceId);
2442 connectionAttachmentResponseInformationBuilder.setObjectPath(connectionAttachmentObjectPath);
2444 .setConnectionAttachmentResponseInformation(connectionAttachmentResponseInformationBuilder.build());
2446 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
2447 serviceResponseInformationBuilder.setInstanceId(siid);
2448 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
2449 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
2451 } catch (IllegalStateException e) {
2452 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
2453 responseBuilder.setResponseCode("500");
2454 responseBuilder.setResponseMessage(e.getMessage());
2455 responseBuilder.setAckFinalIndicator("Y");
2456 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2458 RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
2459 .<ConnectionAttachmentTopologyOperationOutput>status(true)
2460 .withResult(responseBuilder.build())
2463 return Futures.immediateFuture(rpcResult);
2467 responseBuilder.setResponseCode(responseObject.getStatusCode());
2468 responseBuilder.setAckFinalIndicator(ackFinal);
2469 trySetResponseMessage(responseBuilder, responseObject);
2470 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
2471 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
2473 RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
2474 .<ConnectionAttachmentTopologyOperationOutput>status(true)
2475 .withResult(responseBuilder.build())
2478 return Futures.immediateFuture(rpcResult);
2482 public ListenableFuture<RpcResult<TunnelxconnTopologyOperationOutput>> tunnelxconnTopologyOperation(
2483 TunnelxconnTopologyOperationInput input) {
2485 final String svcOperation = "tunnelxconn-topology-operation";
2486 Properties parms = new Properties();
2487 log.info(CALLED_STR, svcOperation);
2489 // create a new response object
2490 TunnelxconnTopologyOperationOutputBuilder responseBuilder = new TunnelxconnTopologyOperationOutputBuilder();
2491 if (hasInvalidServiceId(input)) {
2492 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
2493 responseBuilder.setResponseCode("404");
2494 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
2495 responseBuilder.setAckFinalIndicator("Y");
2497 RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
2498 .<TunnelxconnTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2500 return Futures.immediateFuture(rpcResult);
2502 String siid = input.getServiceInformation().getServiceInstanceId();
2503 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
2504 TunnelxconnTopologyOperationInputBuilder inputBuilder = new TunnelxconnTopologyOperationInputBuilder(input);
2505 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
2507 // Call SLI sync method
2509 ResponseObject responseObject = new ResponseObject("200", "");
2510 String ackFinal = "Y";
2511 String allottedResourceId = ERROR_NETWORK_ID;
2512 String serviceObjectPath = null;
2513 String tunnelxconnObjectPath = null;
2514 Properties respProps = tryGetProperties(svcOperation, parms, responseObject);
2516 if (respProps != null) {
2517 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2518 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2519 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2520 allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
2521 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
2522 tunnelxconnObjectPath = respProps.getProperty("tunnelxconn-object-path");
2525 if (failed(responseObject)) {
2526 responseBuilder.setResponseCode(responseObject.getStatusCode());
2527 responseBuilder.setResponseMessage(responseObject.getMessage());
2528 responseBuilder.setAckFinalIndicator(ackFinal);
2530 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2532 RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
2533 .<TunnelxconnTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2535 return Futures.immediateFuture(rpcResult);
2538 // Got success from SLI
2540 TunnelxconnResponseInformationBuilder tunnelxconnResponseInformationBuilder = new TunnelxconnResponseInformationBuilder();
2541 tunnelxconnResponseInformationBuilder.setInstanceId(allottedResourceId);
2542 tunnelxconnResponseInformationBuilder.setObjectPath(tunnelxconnObjectPath);
2543 responseBuilder.setTunnelxconnResponseInformation(tunnelxconnResponseInformationBuilder.build());
2545 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
2546 serviceResponseInformationBuilder.setInstanceId(siid);
2547 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
2548 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
2550 } catch (IllegalStateException e) {
2551 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
2552 responseBuilder.setResponseCode("500");
2553 responseBuilder.setResponseMessage(e.getMessage());
2554 responseBuilder.setAckFinalIndicator("Y");
2555 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2557 RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
2558 .<TunnelxconnTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2560 return Futures.immediateFuture(rpcResult);
2564 responseBuilder.setResponseCode(responseObject.getStatusCode());
2565 responseBuilder.setAckFinalIndicator(ackFinal);
2566 trySetResponseMessage(responseBuilder, responseObject);
2567 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
2568 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
2570 RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
2571 .<TunnelxconnTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2573 return Futures.immediateFuture(rpcResult);
2576 private void trySetResponseMessage(TunnelxconnTopologyOperationOutputBuilder responseBuilder,
2577 ResponseObject responseObject) {
2578 if (responseObject.getMessage() != null) {
2579 responseBuilder.setResponseMessage(responseObject.getMessage());
2583 private boolean hasInvalidServiceId(TunnelxconnTopologyOperationInput input) {
2584 return input == null || input.getServiceInformation() == null
2585 || input.getServiceInformation().getServiceInstanceId() == null
2586 || input.getServiceInformation().getServiceInstanceId().length() == 0;
2589 private Properties tryGetProperties(String svcOperation, Properties parms, ResponseObject responseObject) {
2591 if (svcLogicClient.hasGraph(APP_NAME, svcOperation, null, "sync")) {
2594 return svcLogicClient.execute(APP_NAME, svcOperation, null, "sync", parms);
2595 } catch (Exception e) {
2596 log.error(SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE, svcOperation, e);
2597 responseObject.setMessage(e.getMessage());
2598 responseObject.setStatusCode("500");
2601 responseObject.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
2602 responseObject.setStatusCode("503");
2604 } catch (Exception e) {
2605 responseObject.setMessage(e.getMessage());
2606 responseObject.setStatusCode("500");
2607 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
2613 public ListenableFuture<RpcResult<BrgTopologyOperationOutput>> brgTopologyOperation(
2614 BrgTopologyOperationInput input) {
2615 final String svcOperation = "brg-topology-operation";
2616 Properties parms = new Properties();
2618 log.info(CALLED_STR, svcOperation);
2619 // create a new response object
2620 BrgTopologyOperationOutputBuilder responseBuilder = new BrgTopologyOperationOutputBuilder();
2622 if (this.hasInvalidServiceId(input)) {
2624 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
2625 responseBuilder.setResponseCode("404");
2626 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
2627 responseBuilder.setAckFinalIndicator("Y");
2629 RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder.<BrgTopologyOperationOutput>status(true)
2630 .withResult(responseBuilder.build()).build();
2632 return Futures.immediateFuture(rpcResult);
2635 String siid = input.getServiceInformation().getServiceInstanceId();
2637 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
2638 BrgTopologyOperationInputBuilder inputBuilder = new BrgTopologyOperationInputBuilder(input);
2639 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
2641 // Call SLI sync method
2643 ResponseObject responseObject = new ResponseObject("200", "");
2644 String ackFinal = "Y";
2645 String allottedResourceId = ERROR_NETWORK_ID;
2646 String serviceObjectPath = null;
2647 String brgObjectPath = null;
2648 Properties respProps = tryGetProperties(svcOperation, parms, responseObject);
2650 if (respProps != null) {
2651 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2652 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2653 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2654 allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
2655 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
2656 brgObjectPath = respProps.getProperty("brg-object-path");
2659 if (failed(responseObject)) {
2660 responseBuilder.setResponseCode(responseObject.getStatusCode());
2661 responseBuilder.setResponseMessage(responseObject.getMessage());
2662 responseBuilder.setAckFinalIndicator(ackFinal);
2664 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2665 RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder.<BrgTopologyOperationOutput>status(true)
2666 .withResult(responseBuilder.build()).build();
2668 return Futures.immediateFuture(rpcResult);
2671 // Got success from SLI
2674 BrgResponseInformationBuilder brgResponseInformationBuilder = new BrgResponseInformationBuilder();
2675 brgResponseInformationBuilder.setInstanceId(allottedResourceId);
2676 brgResponseInformationBuilder.setObjectPath(brgObjectPath);
2677 responseBuilder.setBrgResponseInformation(brgResponseInformationBuilder.build());
2679 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
2680 serviceResponseInformationBuilder.setInstanceId(siid);
2681 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
2682 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
2684 } catch (IllegalStateException e) {
2685 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
2686 responseBuilder.setResponseCode("500");
2687 responseBuilder.setResponseMessage(e.getMessage());
2688 responseBuilder.setAckFinalIndicator("Y");
2689 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2691 RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder.<BrgTopologyOperationOutput>status(true)
2692 .withResult(responseBuilder.build()).build();
2694 return Futures.immediateFuture(rpcResult);
2698 responseBuilder.setResponseCode(responseObject.getStatusCode());
2699 responseBuilder.setAckFinalIndicator(ackFinal);
2700 trySetResponseMessage(responseBuilder, responseObject);
2701 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
2702 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
2704 RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder.<BrgTopologyOperationOutput>status(true)
2705 .withResult(responseBuilder.build()).build();
2707 return Futures.immediateFuture(rpcResult);
2710 private void trySetResponseMessage(BrgTopologyOperationOutputBuilder responseBuilder,
2711 ResponseObject responseObject) {
2712 if (responseObject.getMessage() != null) {
2713 responseBuilder.setResponseMessage(responseObject.getMessage());
2717 private boolean hasInvalidServiceId(BrgTopologyOperationInput input) {
2718 return input == null || input.getServiceInformation() == null
2719 || input.getServiceInformation().getServiceInstanceId() == null
2720 || input.getServiceInformation().getServiceInstanceId().length() == 0;
2723 private String resolveAckFinal(ResponseObject responseObject, Properties respProps) {
2724 if (respProps != null) {
2725 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2726 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2727 return respProps.getProperty(ACK_FINAL_PARAM, "Y");
2733 public ListenableFuture<RpcResult<PreloadNetworkTopologyOperationOutput>> preloadNetworkTopologyOperation(
2734 PreloadNetworkTopologyOperationInput input) {
2736 final String svcOperation = "preload-network-topology-operation";
2737 PreloadData preloadData;
2738 Properties properties = new Properties();
2740 log.info(CALLED_STR, svcOperation);
2741 // create a new response object
2742 PreloadNetworkTopologyOperationOutputBuilder responseBuilder = new PreloadNetworkTopologyOperationOutputBuilder();
2744 if (hasInvalidPreloadNetwork(input)) {
2745 log.debug("exiting {} because of null or empty preload-network-topology-information", svcOperation);
2746 responseBuilder.setResponseCode("403");
2747 responseBuilder.setResponseMessage("invalid input, null or empty preload-network-topology-information");
2748 responseBuilder.setAckFinalIndicator("Y");
2750 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2751 .<PreloadNetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2753 return Futures.immediateFuture(rpcResult);
2756 // Grab the preload ID from the input buffer
2757 String preloadId = input.getPreloadNetworkTopologyInformation().getNetworkTopologyIdentifierStructure()
2759 String preloadType = "network";
2761 trySetSvcRequestId(input, responseBuilder);
2763 PreloadDataBuilder preloadDataBuilder = new PreloadDataBuilder();
2764 getPreloadData(preloadId, preloadType, preloadDataBuilder);
2766 PreloadDataBuilder operDataBuilder = new PreloadDataBuilder();
2767 getPreloadData(preloadId, preloadType, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
2770 // setup a preload-data object builder
2771 // ACTION preload-network-topology-operation
2773 // uses sdnc-request-header;
2774 // uses request-information;
2775 // uses preload-network-topology-information;
2777 // uses preload-topology-response-body;
2779 // container preload-data
2780 // uses preload-network-topology-information;
2781 // uses preload-oper-status;
2783 log.info(ADDING_INPUT_DATA_LOG, svcOperation, preloadId, input);
2784 PreloadNetworkTopologyOperationInputBuilder inputBuilder = new PreloadNetworkTopologyOperationInputBuilder(
2786 GenericResourceApiUtil.toProperties(properties, inputBuilder.build());
2787 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, preloadId, input);
2788 GenericResourceApiUtil.toProperties(properties, OPERATIONAL_DATA_PARAM, operDataBuilder);
2790 // Call SLI sync method
2791 ResponseObject responseObject = new ResponseObject("200", "");
2792 String ackFinal = "Y";
2793 Properties respProps = tryGetProperties(svcOperation, properties, preloadDataBuilder, responseObject);
2795 if (respProps != null) {
2796 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2797 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2798 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2801 if (failed(responseObject)) {
2802 responseBuilder.setResponseCode(responseObject.getStatusCode());
2803 responseBuilder.setResponseMessage(responseObject.getMessage());
2804 responseBuilder.setAckFinalIndicator(ackFinal);
2805 log.error(RETURNED_FAILED_MESSAGE, svcOperation, preloadId, responseBuilder.build());
2806 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2807 .<PreloadNetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2808 return Futures.immediateFuture(rpcResult);
2811 // Got success from SLI
2813 preloadData = preloadDataBuilder.build();
2814 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, preloadId, preloadData);
2816 // preload-list object
2817 PreloadListBuilder preloadListBuilder = new PreloadListBuilder();
2818 preloadListBuilder.setPreloadId(preloadId);
2819 preloadListBuilder.setPreloadType(preloadType);
2820 preloadListBuilder.setPreloadData(preloadData);
2822 savePreloadList(preloadListBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
2823 log.info(UPDATING_TREE_INFO_MESSAGE);
2824 savePreloadList(preloadListBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
2826 tryDeletePreload(input, preloadListBuilder);
2827 } catch (Exception e) {
2828 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, preloadId, e);
2829 responseBuilder.setResponseCode("500");
2830 responseBuilder.setResponseMessage(e.getMessage());
2831 responseBuilder.setAckFinalIndicator("Y");
2832 log.error(RETURNED_FAILED_MESSAGE, svcOperation, preloadId, responseBuilder.build());
2833 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2834 .<PreloadNetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2835 return Futures.immediateFuture(rpcResult);
2839 responseBuilder.setResponseCode(responseObject.getStatusCode());
2840 responseBuilder.setAckFinalIndicator(ackFinal);
2841 trySetResponseMessage(responseBuilder, responseObject);
2842 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, preloadId);
2843 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, preloadId, responseBuilder.build());
2845 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2846 .<PreloadNetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2847 return Futures.immediateFuture(rpcResult);
2850 private boolean hasInvalidPreloadNetwork(PreloadNetworkTopologyOperationInput input) {
2851 return input == null || input.getPreloadNetworkTopologyInformation() == null
2852 || input.getPreloadNetworkTopologyInformation().getNetworkTopologyIdentifierStructure() == null;
2855 private boolean hasInvalidPreloadId(String preloadId) {
2856 return preloadId == null || preloadId.length() == 0;
2859 private void trySetSvcRequestId(PreloadNetworkTopologyOperationInput input,
2860 PreloadNetworkTopologyOperationOutputBuilder responseBuilder) {
2861 if (input.getSdncRequestHeader() != null) {
2862 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
2866 private Properties tryGetProperties(String svcOperation, Properties parms, PreloadDataBuilder preloadDataBuilder,
2867 ResponseObject responseObject) {
2869 if (svcLogicClient.hasGraph(APP_NAME, svcOperation, null, "sync")) {
2871 return svcLogicClient.execute(APP_NAME, svcOperation, null, "sync", preloadDataBuilder, parms);
2872 } catch (Exception e) {
2873 log.error(SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE, svcOperation, e);
2874 responseObject.setMessage(e.getMessage());
2875 responseObject.setStatusCode("500");
2878 responseObject.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
2879 responseObject.setStatusCode("503");
2881 } catch (Exception e) {
2882 responseObject.setMessage(e.getMessage());
2883 responseObject.setStatusCode("500");
2884 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
2890 private void trySetResponseMessage(PreloadNetworkTopologyOperationOutputBuilder responseBuilder,
2891 ResponseObject responseObject) {
2892 if (responseObject.getMessage() != null) {
2893 if (!responseObject.getMessage().isEmpty()) {
2894 responseBuilder.setResponseMessage(responseObject.getMessage());
2899 private void tryDeletePreload(PreloadNetworkTopologyOperationInput input, PreloadListBuilder preloadListBuilder) {
2900 if (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete)) {
2901 log.info("Delete from both CONFIGURATION and OPERATIONAL tree.");
2902 deletePreloadList(preloadListBuilder.build(), LogicalDatastoreType.OPERATIONAL);
2903 deletePreloadList(preloadListBuilder.build(), LogicalDatastoreType.CONFIGURATION);
2908 public ListenableFuture<RpcResult<PreloadVfModuleTopologyOperationOutput>> preloadVfModuleTopologyOperation(
2909 PreloadVfModuleTopologyOperationInput input) {
2911 final String svcOperation = "preload-vf-module-topology-operation";
2912 PreloadData preloadData;
2913 Properties properties = new Properties();
2915 log.info(CALLED_STR, svcOperation);
2916 // create a new response object
2917 PreloadVfModuleTopologyOperationOutputBuilder responseBuilder = new PreloadVfModuleTopologyOperationOutputBuilder();
2919 if (hasInvalidPreloadVfModule(input)) {
2921 "exiting {} because of null or empty preload-vf-module-topology-information.vf-module-topology.vf-module-topology-identifier.vf-module-name",
2923 responseBuilder.setResponseCode("403");
2924 responseBuilder.setResponseMessage(
2925 "invalid input, null or empty preload-vf-module-topology-information.vf-module-topology.vf-module-topology-identifier.vf-module-name");
2926 responseBuilder.setAckFinalIndicator("Y");
2928 RpcResult<PreloadVfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
2929 .<PreloadVfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2931 return Futures.immediateFuture(rpcResult);
2934 // Grab the preload ID from the input buffer
2935 String preloadId = input.getPreloadVfModuleTopologyInformation().getVfModuleTopology()
2936 .getVfModuleTopologyIdentifier().getVfModuleName();
2937 String preloadType = "vf-module";
2939 trySetSvcRequestId(input, responseBuilder);
2941 PreloadDataBuilder preloadDataBuilder = new PreloadDataBuilder();
2942 getPreloadData(preloadId, preloadType, preloadDataBuilder);
2944 PreloadDataBuilder operDataBuilder = new PreloadDataBuilder();
2945 getPreloadData(preloadId, preloadType, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
2948 // setup a preload-data object builder
2949 // ACTION preload-vf-module-topology-operation
2951 // uses sdnc-request-header;
2952 // uses request-information;
2953 // uses preload-vnf-topology-information;
2955 // uses preload-topology-response-body;
2957 // container preload-data
2958 // uses preload-vf-module-topology-information;
2959 // uses preload-oper-status;
2961 log.info(ADDING_INPUT_DATA_LOG, svcOperation, preloadId, input);
2962 PreloadVfModuleTopologyOperationInputBuilder inputBuilder = new PreloadVfModuleTopologyOperationInputBuilder(
2964 GenericResourceApiUtil.toProperties(properties, inputBuilder.build());
2965 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, preloadId, input);
2966 GenericResourceApiUtil.toProperties(properties, OPERATIONAL_DATA_PARAM, operDataBuilder);
2968 // Call SLI sync method
2969 ResponseObject responseObject = new ResponseObject("200", "");
2970 String ackFinal = "Y";
2971 Properties respProps = tryGetProperties(svcOperation, properties, preloadDataBuilder, responseObject);
2973 if (respProps != null) {
2974 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2975 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2976 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2979 if (failed(responseObject)) {
2980 responseBuilder.setResponseCode(responseObject.getStatusCode());
2981 responseBuilder.setResponseMessage(responseObject.getMessage());
2982 responseBuilder.setAckFinalIndicator(ackFinal);
2983 log.error(RETURNED_FAILED_MESSAGE, svcOperation, preloadId, responseBuilder.build());
2984 RpcResult<PreloadVfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
2985 .<PreloadVfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2986 return Futures.immediateFuture(rpcResult);
2989 // Got success from SLI
2991 preloadData = preloadDataBuilder.build();
2992 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, preloadId, preloadData);
2994 // preload-list object
2995 PreloadListBuilder preloadListBuilder = new PreloadListBuilder();
2996 preloadListBuilder.setPreloadId(preloadId);
2997 preloadListBuilder.setPreloadType(preloadType);
2998 preloadListBuilder.setPreloadData(preloadData);
3000 savePreloadList(preloadListBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
3001 log.info(UPDATING_TREE_INFO_MESSAGE);
3002 savePreloadList(preloadListBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
3004 tryDeletePreload(input, preloadListBuilder);
3006 } catch (Exception e) {
3007 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, preloadId, e);
3008 responseBuilder.setResponseCode("500");
3009 responseBuilder.setResponseMessage(e.getMessage());
3010 responseBuilder.setAckFinalIndicator("Y");
3011 log.error(RETURNED_FAILED_MESSAGE, svcOperation, preloadId, responseBuilder.build());
3012 RpcResult<PreloadVfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
3013 .<PreloadVfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3014 return Futures.immediateFuture(rpcResult);
3018 responseBuilder.setResponseCode(responseObject.getStatusCode());
3019 responseBuilder.setAckFinalIndicator(ackFinal);
3020 trySetResponseMessage(responseBuilder, responseObject);
3021 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, preloadId);
3022 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, preloadId, responseBuilder.build());
3024 RpcResult<PreloadVfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
3025 .<PreloadVfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3026 return Futures.immediateFuture(rpcResult);
3029 private boolean hasInvalidPreloadVfModule(PreloadVfModuleTopologyOperationInput input) {
3030 return input == null || input.getPreloadVfModuleTopologyInformation() == null
3031 || input.getPreloadVfModuleTopologyInformation().getVfModuleTopology() == null
3032 || input.getPreloadVfModuleTopologyInformation().getVfModuleTopology()
3033 .getVfModuleTopologyIdentifier() == null
3034 || input.getPreloadVfModuleTopologyInformation().getVfModuleTopology().getVfModuleTopologyIdentifier()
3035 .getVfModuleName() == null;
3038 private void trySetSvcRequestId(PreloadVfModuleTopologyOperationInput input,
3039 PreloadVfModuleTopologyOperationOutputBuilder responseBuilder) {
3040 if (input.getSdncRequestHeader() != null) {
3041 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
3045 private void trySetResponseMessage(PreloadVfModuleTopologyOperationOutputBuilder responseBuilder,
3046 ResponseObject responseObject) {
3047 if (responseObject.getMessage() != null) {
3048 if (!responseObject.getMessage().isEmpty()) {
3049 responseBuilder.setResponseMessage(responseObject.getMessage());
3054 private void tryDeletePreload(PreloadVfModuleTopologyOperationInput input, PreloadListBuilder preloadListBuilder) {
3055 if (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete)) {
3056 log.info("Delete from both CONFIGURATION and OPERATIONAL tree.");
3057 deletePreloadList(preloadListBuilder.build(), LogicalDatastoreType.OPERATIONAL);
3058 deletePreloadList(preloadListBuilder.build(), LogicalDatastoreType.CONFIGURATION);
3063 public ListenableFuture<RpcResult<GenericConfigurationTopologyOperationOutput>> genericConfigurationTopologyOperation(
3064 GenericConfigurationTopologyOperationInput input) {
3066 final String svcOperation = "generic-configuration-topology-operation";
3067 ServiceData serviceData;
3068 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
3069 Properties parms = new Properties();
3071 log.info(CALLED_STR, svcOperation);
3072 // create a new response object
3073 GenericConfigurationTopologyOperationOutputBuilder responseBuilder = new GenericConfigurationTopologyOperationOutputBuilder();
3075 if (hasInvalidService(input)) {
3076 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
3077 responseBuilder.setResponseCode("404");
3078 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
3079 responseBuilder.setAckFinalIndicator("Y");
3081 RpcResult<GenericConfigurationTopologyOperationOutput> rpcResult = RpcResultBuilder
3082 .<GenericConfigurationTopologyOperationOutput>status(true).withResult(responseBuilder.build())
3085 return Futures.immediateFuture(rpcResult);
3088 // Grab the service instance ID from the input buffer
3089 String siid = input.getServiceInformation().getServiceInstanceId();
3091 trySetSvcRequestId(input, responseBuilder);
3093 if (hasInvalidConfigurationIdOrType(input)) {
3094 log.debug("exiting {} because of null or empty configuration-id or configuration-type", svcOperation);
3095 responseBuilder.setResponseCode("404");
3096 responseBuilder.setResponseMessage("invalid input, null or empty configuration-id or configuration-type");
3097 responseBuilder.setAckFinalIndicator("Y");
3098 RpcResult<GenericConfigurationTopologyOperationOutput> rpcResult = RpcResultBuilder
3099 .<GenericConfigurationTopologyOperationOutput>status(true).withResult(responseBuilder.build())
3101 return Futures.immediateFuture(rpcResult);
3104 // Grab the configuration ID from the input buffer
3105 String configId = input.getConfigurationInformation().getConfigurationId();
3107 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
3108 getServiceData(siid, serviceDataBuilder);
3110 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
3111 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
3113 // Set the serviceStatus based on input
3114 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
3115 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
3117 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
3118 GenericConfigurationTopologyOperationInputBuilder inputBuilder = new GenericConfigurationTopologyOperationInputBuilder(
3120 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
3122 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
3123 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
3125 // Call SLI sync method
3127 ResponseObject responseObject = new ResponseObject("200", "");
3128 String ackFinal = "Y";
3129 String serviceObjectPath = "";
3130 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
3132 if (respProps != null) {
3133 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
3134 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
3135 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
3136 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
3139 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
3140 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
3141 serviceStatusBuilder.setRpcName(svcOperation);
3143 if (failed(responseObject)) {
3144 responseBuilder.setResponseCode(responseObject.getStatusCode());
3145 responseBuilder.setResponseMessage(responseObject.getMessage());
3146 responseBuilder.setAckFinalIndicator(ackFinal);
3148 ServiceBuilder serviceBuilder = new ServiceBuilder();
3149 serviceBuilder.setServiceInstanceId(siid);
3150 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3152 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
3153 } catch (Exception e) {
3154 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3156 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
3158 RpcResult<GenericConfigurationTopologyOperationOutput> rpcResult = RpcResultBuilder
3159 .<GenericConfigurationTopologyOperationOutput>status(true).withResult(responseBuilder.build())
3162 return Futures.immediateFuture(rpcResult);
3165 // Got success from SLI
3167 serviceData = serviceDataBuilder.build();
3170 ServiceBuilder serviceBuilder = new ServiceBuilder();
3171 serviceBuilder.setServiceData(serviceData);
3172 serviceBuilder.setServiceInstanceId(siid);
3173 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3174 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
3176 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
3177 serviceResponseInformationBuilder.setInstanceId(siid);
3178 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
3179 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
3180 GcResponseInformationBuilder gcResponseInformationBuilder = new GcResponseInformationBuilder();
3181 gcResponseInformationBuilder.setInstanceId(configId);
3182 responseBuilder.setGcResponseInformation(gcResponseInformationBuilder.build());
3184 } catch (Exception e) {
3185 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3186 responseBuilder.setResponseCode("500");
3187 responseBuilder.setResponseMessage(e.getMessage());
3188 responseBuilder.setAckFinalIndicator("Y");
3189 RpcResult<GenericConfigurationTopologyOperationOutput> rpcResult = RpcResultBuilder
3190 .<GenericConfigurationTopologyOperationOutput>status(true).withResult(responseBuilder.build())
3193 return Futures.immediateFuture(rpcResult);
3197 responseBuilder.setResponseCode(responseObject.getStatusCode());
3198 responseBuilder.setAckFinalIndicator(ackFinal);
3199 trySetResponseMessage(responseBuilder, responseObject);
3200 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
3201 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
3203 RpcResult<GenericConfigurationTopologyOperationOutput> rpcResult = RpcResultBuilder
3204 .<GenericConfigurationTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3206 return Futures.immediateFuture(rpcResult);
3209 private boolean hasInvalidService(GenericConfigurationTopologyOperationInput input) {
3210 return input == null || input.getServiceInformation() == null
3211 || input.getServiceInformation().getServiceInstanceId() == null
3212 || input.getServiceInformation().getServiceInstanceId().length() == 0;
3215 private void trySetSvcRequestId(GenericConfigurationTopologyOperationInput input,
3216 GenericConfigurationTopologyOperationOutputBuilder responseBuilder) {
3217 if (input.getSdncRequestHeader() != null) {
3218 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
3222 private boolean hasInvalidConfigurationIdOrType(GenericConfigurationTopologyOperationInput input) {
3223 return input.getConfigurationInformation() == null
3224 || input.getConfigurationInformation().getConfigurationId() == null
3225 || input.getConfigurationInformation().getConfigurationType() == null;
3228 private void trySetResponseMessage(GenericConfigurationTopologyOperationOutputBuilder responseBuilder,
3229 ResponseObject responseObject) {
3230 if (responseObject.getMessage() != null) {
3231 if (!responseObject.getMessage().isEmpty()) {
3232 responseBuilder.setResponseMessage(responseObject.getMessage());
3238 public ListenableFuture<RpcResult<GenericConfigurationNotificationOutput>> genericConfigurationNotification(
3239 GenericConfigurationNotificationInput input) {
3241 final String svcOperation = "generic-configuration-notification";
3242 ServiceData serviceData;
3243 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
3244 Properties parms = new Properties();
3246 log.info(CALLED_STR, svcOperation);
3248 // Grab the service instance ID from the input buffer
3249 String siid = input.getServiceInformation().getServiceInstanceId();
3251 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
3252 getServiceData(siid, serviceDataBuilder);
3254 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
3255 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
3257 // Set the serviceStatus based on input
3258 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
3259 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
3261 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
3262 GenericConfigurationNotificationInputBuilder inputBuilder = new GenericConfigurationNotificationInputBuilder(
3264 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
3266 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
3267 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
3269 // Call SLI sync method
3271 ResponseObject responseObject = new ResponseObject("200", "");
3272 String ackFinal = "Y";
3273 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
3275 if (respProps != null) {
3276 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
3277 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
3278 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
3281 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
3282 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
3283 serviceStatusBuilder.setRpcName(svcOperation);
3285 if (failed(responseObject)) {
3286 ServiceBuilder serviceBuilder = new ServiceBuilder();
3287 serviceBuilder.setServiceInstanceId(siid);
3288 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3290 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
3291 } catch (Exception e) {
3292 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3295 RpcResult<GenericConfigurationNotificationOutput> rpcResult = RpcResultBuilder.<GenericConfigurationNotificationOutput>status(
3298 return Futures.immediateFuture(rpcResult);
3301 // Got success from SLI
3303 serviceData = serviceDataBuilder.build();
3306 ServiceBuilder serviceBuilder = new ServiceBuilder();
3307 serviceBuilder.setServiceData(serviceData);
3308 serviceBuilder.setServiceInstanceId(siid);
3309 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3310 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
3312 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
3313 serviceResponseInformationBuilder.setInstanceId(siid);
3315 } catch (Exception e) {
3316 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3317 RpcResult<GenericConfigurationNotificationOutput> rpcResult = RpcResultBuilder.<GenericConfigurationNotificationOutput>status(
3320 return Futures.immediateFuture(rpcResult);
3324 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
3326 RpcResult<GenericConfigurationNotificationOutput> rpcResult = RpcResultBuilder.<GenericConfigurationNotificationOutput>status(
3329 return Futures.immediateFuture(rpcResult);
3333 public ListenableFuture<RpcResult<GetpathsegmentTopologyOperationOutput>> getpathsegmentTopologyOperation(
3334 GetpathsegmentTopologyOperationInput input) {
3336 final String svcOperation = "getpathsegment-topology-operation";
3337 ServiceData serviceData;
3338 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
3339 Properties parms = new Properties();
3341 log.info(CALLED_STR, svcOperation);
3342 // create a new response object
3343 GetpathsegmentTopologyOperationOutputBuilder responseBuilder = new GetpathsegmentTopologyOperationOutputBuilder();
3345 if (hasInvalidService(input)) {
3346 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
3347 responseBuilder.setResponseCode("404");
3348 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
3349 responseBuilder.setAckFinalIndicator("Y");
3351 RpcResult<GetpathsegmentTopologyOperationOutput> rpcResult = RpcResultBuilder
3352 .<GetpathsegmentTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3354 return Futures.immediateFuture(rpcResult);
3357 // Grab the service instance ID from the input buffer
3358 String siid = input.getServiceInformation().getServiceInstanceId();
3360 trySetSvcRequestId(input, responseBuilder);
3362 if (hasInvalidOnapModelInformation(input)) {
3363 log.debug("exiting {} because no model-uuid provided", svcOperation);
3364 responseBuilder.setResponseCode("404");
3365 responseBuilder.setResponseMessage("invalid input, no model-uuid provided");
3366 responseBuilder.setAckFinalIndicator("Y");
3367 RpcResult<GetpathsegmentTopologyOperationOutput> rpcResult = RpcResultBuilder
3368 .<GetpathsegmentTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3369 return Futures.immediateFuture(rpcResult);
3372 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
3373 getServiceData(siid, serviceDataBuilder);
3375 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
3376 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
3378 // Set the serviceStatus based on input
3379 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
3380 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
3382 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
3383 GetpathsegmentTopologyOperationInputBuilder inputBuilder = new GetpathsegmentTopologyOperationInputBuilder(
3385 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
3387 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
3388 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
3390 // Call SLI sync method
3392 ResponseObject responseObject = new ResponseObject("200", "");
3393 String ackFinal = "Y";
3394 String serviceObjectPath = null;
3395 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
3397 if (respProps != null) {
3398 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
3399 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
3400 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
3401 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
3404 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
3405 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
3406 serviceStatusBuilder.setRpcName(svcOperation);
3408 if (failed(responseObject)) {
3409 responseBuilder.setResponseCode(responseObject.getStatusCode());
3410 responseBuilder.setResponseMessage(responseObject.getMessage());
3411 responseBuilder.setAckFinalIndicator(ackFinal);
3413 ServiceBuilder serviceBuilder = new ServiceBuilder();
3414 serviceBuilder.setServiceInstanceId(siid);
3415 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3417 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
3418 } catch (Exception e) {
3419 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3421 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
3423 RpcResult<GetpathsegmentTopologyOperationOutput> rpcResult = RpcResultBuilder
3424 .<GetpathsegmentTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3426 return Futures.immediateFuture(rpcResult);
3429 // Got success from SLI
3431 serviceData = serviceDataBuilder.build();
3432 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
3435 ServiceBuilder serviceBuilder = new ServiceBuilder();
3436 serviceBuilder.setServiceData(serviceData);
3437 serviceBuilder.setServiceInstanceId(siid);
3438 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3439 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
3441 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
3442 serviceResponseInformationBuilder.setInstanceId(siid);
3443 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
3444 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
3446 } catch (Exception e) {
3447 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3448 responseBuilder.setResponseCode("500");
3449 responseBuilder.setResponseMessage(e.getMessage());
3450 responseBuilder.setAckFinalIndicator("Y");
3451 RpcResult<GetpathsegmentTopologyOperationOutput> rpcResult = RpcResultBuilder
3452 .<GetpathsegmentTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3454 return Futures.immediateFuture(rpcResult);
3458 responseBuilder.setResponseCode(responseObject.getStatusCode());
3459 responseBuilder.setAckFinalIndicator(ackFinal);
3460 trySetResponseMessage(responseBuilder, responseObject);
3461 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
3462 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
3464 RpcResult<GetpathsegmentTopologyOperationOutput> rpcResult = RpcResultBuilder
3465 .<GetpathsegmentTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3467 return Futures.immediateFuture(rpcResult);
3470 private boolean hasInvalidService(GetpathsegmentTopologyOperationInput input) {
3471 return input == null || input.getServiceInformation() == null
3472 || input.getServiceInformation().getServiceInstanceId() == null
3473 || input.getServiceInformation().getServiceInstanceId().length() == 0;
3476 private void trySetSvcRequestId(GetpathsegmentTopologyOperationInput input,
3477 GetpathsegmentTopologyOperationOutputBuilder responseBuilder) {
3478 if (input.getSdncRequestHeader() != null) {
3479 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
3483 private boolean hasInvalidOnapModelInformation(GetpathsegmentTopologyOperationInput input) {
3484 return input.getServiceInformation() == null || input.getServiceInformation().getOnapModelInformation() == null
3485 || input.getServiceInformation().getOnapModelInformation().getModelUuid() == null;
3488 private void trySetResponseMessage(GetpathsegmentTopologyOperationOutputBuilder responseBuilder,
3489 ResponseObject responseObject) {
3490 if (responseObject.getMessage() != null) {
3491 if (!responseObject.getMessage().isEmpty()) {
3492 responseBuilder.setResponseMessage(responseObject.getMessage());
3498 public ListenableFuture<RpcResult<PolicyUpdateNotifyOperationOutput>> policyUpdateNotifyOperation(
3499 PolicyUpdateNotifyOperationInput input) {
3501 final String svcOperation = "policy-update-notify-operation";
3502 Properties parms = new Properties();
3504 log.info(CALLED_STR, svcOperation);
3506 // create a new response object
3507 PolicyUpdateNotifyOperationOutputBuilder responseBuilder = new PolicyUpdateNotifyOperationOutputBuilder();
3509 // Make sure we have a valid input
3510 if (hasInvalidInput(input)) {
3511 log.debug("exiting {} because policy name, update type, or version id was not provided", svcOperation);
3512 responseBuilder.setErrorCode("404");
3513 responseBuilder.setErrorMsg("Invalid input, missing input data");
3514 RpcResult<PolicyUpdateNotifyOperationOutput> rpcResult = RpcResultBuilder
3515 .<PolicyUpdateNotifyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3516 return Futures.immediateFuture(rpcResult);
3519 log.info("Adding INPUT data for {} input: {}", svcOperation, input);
3520 PolicyUpdateNotifyOperationInputBuilder inputBuilder = new PolicyUpdateNotifyOperationInputBuilder(input);
3521 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
3523 // Call SLI sync method
3524 ResponseObject responseObject = new ResponseObject("200", "");
3525 String ackFinal = "Y";
3526 String serviceObjectPath = null;
3527 Properties respProps = tryGetProperties(svcOperation, parms, responseObject);
3529 if (respProps != null) {
3530 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
3531 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
3532 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
3533 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
3536 if (failed(responseObject)) {
3537 responseBuilder.setErrorCode(responseObject.getStatusCode());
3538 responseBuilder.setErrorMsg(responseObject.getMessage());
3539 log.error(RETURNED_FAILED_MESSAGE, svcOperation, "policy update", responseBuilder.build());
3541 RpcResult<PolicyUpdateNotifyOperationOutput> rpcResult = RpcResultBuilder
3542 .<PolicyUpdateNotifyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3544 return Futures.immediateFuture(rpcResult);
3547 // Got success from SLI
3548 responseBuilder.setErrorCode(responseObject.getStatusCode());
3549 if (responseObject.getMessage() != null) {
3550 responseBuilder.setErrorMsg(responseObject.getMessage());
3552 log.info("Returned SUCCESS for " + svcOperation + responseBuilder.build());
3553 RpcResult<PolicyUpdateNotifyOperationOutput> rpcResult = RpcResultBuilder
3554 .<PolicyUpdateNotifyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3556 return Futures.immediateFuture(rpcResult);
3559 private boolean hasInvalidInput(PolicyUpdateNotifyOperationInput input) {
3560 return (input.getPolicyName() == null) || (input.getUpdateType() == null) || (input.getVersionId() == null);
3564 public ListenableFuture<RpcResult<PortMirrorTopologyOperationOutput>> portMirrorTopologyOperation(
3565 final PortMirrorTopologyOperationInput input) {
3567 final String svcOperation = "port-mirror-topology-operation";
3568 ServiceData serviceData = null;
3569 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
3570 Properties properties = new Properties();
3572 log.info(CALLED_STR, svcOperation);
3574 // create a new response object
3575 PortMirrorTopologyOperationOutputBuilder responseBuilder = new PortMirrorTopologyOperationOutputBuilder();
3577 if (hasInvalidService(input)) {
3578 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
3579 responseBuilder.setResponseCode("404");
3580 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
3581 responseBuilder.setAckFinalIndicator("Y");
3582 RpcResult<PortMirrorTopologyOperationOutput> rpcResult = RpcResultBuilder
3583 .<PortMirrorTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3585 return Futures.immediateFuture(rpcResult);
3588 if (hasInvalidConfigurationId(input)) {
3589 log.debug("exiting {} because of null or empty configuration-id", svcOperation);
3590 responseBuilder.setResponseCode("404");
3591 responseBuilder.setResponseMessage("invalid input, null or empty configuration-id");
3592 responseBuilder.setAckFinalIndicator("Y");
3593 RpcResult<PortMirrorTopologyOperationOutput> rpcResult = RpcResultBuilder
3594 .<PortMirrorTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3595 return Futures.immediateFuture(rpcResult);
3598 // Grab the service instance ID from the input buffer
3599 String siid = input.getServiceInformation().getServiceInstanceId();
3601 trySetSvcRequestId(input, responseBuilder);
3603 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
3604 getServiceData(siid, serviceDataBuilder);
3606 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
3607 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
3609 // Set the serviceStatus based on input
3610 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
3611 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
3613 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
3614 PortMirrorTopologyOperationInputBuilder inputBuilder = new PortMirrorTopologyOperationInputBuilder(input);
3615 GenericResourceApiUtil.toProperties(properties, inputBuilder.build());
3617 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
3618 GenericResourceApiUtil.toProperties(properties, OPERATIONAL_DATA_PARAM, operDataBuilder);
3620 // Call SLI sync method
3621 ResponseObject responseObject = new ResponseObject("200", "");
3622 String ackFinal = "Y";
3623 String serviceObjectPath = null;
3624 String portMirrorObjectPath = null;
3625 Properties respProps = tryGetProperties(svcOperation, properties, serviceDataBuilder, responseObject);
3627 if (respProps != null) {
3628 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
3629 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
3630 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
3631 serviceObjectPath = respProps.getProperty("service-object-path");
3632 portMirrorObjectPath = respProps.getProperty("port-mirror-object-path");
3635 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
3636 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
3637 serviceStatusBuilder.setRpcName(svcOperation);
3639 if (failed(responseObject)) {
3640 responseBuilder.setResponseCode(responseObject.getStatusCode());
3641 responseBuilder.setResponseMessage(responseObject.getMessage());
3642 responseBuilder.setAckFinalIndicator(ackFinal);
3644 ServiceBuilder serviceBuilder = new ServiceBuilder();
3645 serviceBuilder.setServiceInstanceId(siid);
3646 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3648 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
3649 } catch (Exception e) {
3650 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3652 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
3654 RpcResult<PortMirrorTopologyOperationOutput> rpcResult = RpcResultBuilder
3655 .<PortMirrorTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3658 return Futures.immediateFuture(rpcResult);
3661 // Got success from SLI
3663 serviceData = serviceDataBuilder.build();
3664 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
3667 ServiceBuilder serviceBuilder = new ServiceBuilder();
3668 serviceBuilder.setServiceData(serviceData);
3669 serviceBuilder.setServiceInstanceId(siid);
3670 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3671 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
3673 if (input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null) {
3674 // Only update operational tree on activate or delete
3675 if (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign)
3676 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)) {
3677 log.info(UPDATING_TREE_INFO_MESSAGE);
3678 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
3682 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
3683 serviceResponseInformationBuilder.setInstanceId(siid);
3684 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
3685 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
3686 PortMirrorResponseInformationBuilder portMirrorResponseInformationBuilder = new PortMirrorResponseInformationBuilder();
3687 portMirrorResponseInformationBuilder
3688 .setInstanceId(input.getConfigurationInformation().getConfigurationId());
3689 portMirrorResponseInformationBuilder.setObjectPath(portMirrorObjectPath);
3690 responseBuilder.setPortMirrorResponseInformation(portMirrorResponseInformationBuilder.build());
3692 } catch (Exception e) {
3693 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3694 responseBuilder.setResponseCode("500");
3695 responseBuilder.setResponseMessage(e.getMessage());
3696 responseBuilder.setAckFinalIndicator("Y");
3697 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
3698 RpcResult<PortMirrorTopologyOperationOutput> rpcResult = RpcResultBuilder
3699 .<PortMirrorTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3700 return Futures.immediateFuture(rpcResult);
3704 responseBuilder.setResponseCode(responseObject.getStatusCode());
3705 responseBuilder.setAckFinalIndicator(ackFinal);
3706 trySetResponseMessage(responseBuilder, responseObject);
3707 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
3708 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
3710 RpcResult<PortMirrorTopologyOperationOutput> rpcResult = RpcResultBuilder
3711 .<PortMirrorTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3713 if (ackFinal.equals("N")) {
3714 // Spawn background thread to invoke the Async DG
3715 Runnable backgroundThread = new Runnable() {
3717 log.info(BACKGROUND_THREAD_STARTED_MESSAGE);
3718 processAsyncPortMirrorTopologyOperation(input);
3721 new Thread(backgroundThread).start();
3725 return Futures.immediateFuture(rpcResult);
3728 private boolean hasInvalidService(PortMirrorTopologyOperationInput input) {
3729 return input == null || input.getServiceInformation() == null
3730 || input.getServiceInformation().getServiceInstanceId() == null
3731 || input.getServiceInformation().getServiceInstanceId().length() == 0;
3734 private boolean hasInvalidConfigurationId(PortMirrorTopologyOperationInput input) {
3735 return input.getConfigurationInformation() == null
3736 || input.getConfigurationInformation().getConfigurationId() == null
3737 || input.getConfigurationInformation().getConfigurationId().length() == 0;
3740 private void trySetSvcRequestId(PortMirrorTopologyOperationInput input,
3741 PortMirrorTopologyOperationOutputBuilder responseBuilder) {
3742 if (input.getSdncRequestHeader() != null) {
3743 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
3747 private void trySetResponseMessage(PortMirrorTopologyOperationOutputBuilder responseBuilder,
3748 ResponseObject responseObject) {
3749 if (responseObject.getMessage() != null) {
3750 if (!responseObject.getMessage().isEmpty()) {
3751 responseBuilder.setResponseMessage(responseObject.getMessage());
3756 public void processAsyncPortMirrorTopologyOperation(PortMirrorTopologyOperationInput input) {
3757 log.info(BACKGROUND_THREAD_INFO, input.getConfigurationInformation().getConfigurationId());
3759 final String svcOperation = "port-mirror-topology-operation-async";
3760 ServiceData serviceData = null;
3761 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
3762 Properties parms = new Properties();
3764 log.info(CALLED_STR, svcOperation);
3766 // Grab the service instance ID from the input buffer
3767 String siid = input.getServiceInformation().getServiceInstanceId();
3769 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
3770 getServiceData(siid, serviceDataBuilder);
3772 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
3773 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
3775 // Set the serviceStatus based on input
3776 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
3777 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
3779 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
3780 PortMirrorTopologyOperationInputBuilder inputBuilder = new PortMirrorTopologyOperationInputBuilder(input);
3781 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
3783 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
3784 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
3786 // Call SLI sync method
3787 ResponseObject responseObject = new ResponseObject("200", "");
3788 String ackFinal = "Y";
3789 String serviceObjectPath = null;
3790 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
3792 if (respProps != null) {
3793 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
3794 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
3795 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
3798 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
3799 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
3800 serviceStatusBuilder.setRpcName(svcOperation);
3802 if (failed(responseObject)) {
3803 ServiceBuilder serviceBuilder = new ServiceBuilder();
3804 serviceBuilder.setServiceInstanceId(siid);
3805 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3807 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
3808 } catch (Exception e) {
3809 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3816 // Got success from SLI
3818 serviceData = serviceDataBuilder.build();
3819 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
3822 ServiceBuilder serviceBuilder = new ServiceBuilder();
3823 serviceBuilder.setServiceData(serviceData);
3824 serviceBuilder.setServiceInstanceId(siid);
3825 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3826 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
3828 if (input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null) {
3829 // Only update operational tree on activate or delete
3830 if (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign)
3831 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)) {
3832 log.info(UPDATING_TREE_INFO_MESSAGE);
3833 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
3837 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
3838 serviceResponseInformationBuilder.setInstanceId(siid);
3839 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
3841 } catch (Exception e) {
3842 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3847 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
3853 public ListenableFuture<RpcResult<VnfGetResourceRequestOutput>> vnfGetResourceRequest(
3854 VnfGetResourceRequestInput input) {
3856 final String svcOperation = "vnf-get-resource-request";
3857 ServiceData serviceData;
3858 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
3859 Properties parms = new Properties();
3861 log.info(CALLED_STR, svcOperation);
3862 // create a new response object
3863 VnfGetResourceRequestOutputBuilder responseBuilder = new VnfGetResourceRequestOutputBuilder();
3865 if (hasInvalidService(input)) {
3866 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
3867 RpcResult<VnfGetResourceRequestOutput> rpcResult = RpcResultBuilder
3868 .<VnfGetResourceRequestOutput>status(true).withResult(responseBuilder.build()).build();
3870 return Futures.immediateFuture(rpcResult);
3873 // Grab the service instance ID from the input buffer
3874 String siid = input.getServiceInformation().getServiceInstanceId();
3876 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
3877 getServiceData(siid, serviceDataBuilder);
3879 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
3880 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
3882 // Set the serviceStatus based on input
3883 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
3884 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
3886 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
3887 VnfGetResourceRequestInputBuilder inputBuilder = new VnfGetResourceRequestInputBuilder(input);
3888 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
3890 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
3891 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
3893 // Call SLI sync method
3895 ResponseObject responseObject = new ResponseObject("200", "");
3896 String ackFinal = "Y";
3897 String serviceObjectPath = null;
3898 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
3900 if (respProps != null) {
3901 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
3902 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
3903 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
3904 serviceObjectPath = respProps.getProperty("service-object-path");
3907 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
3908 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
3909 serviceStatusBuilder.setRpcName(svcOperation);
3911 if (failed(responseObject)) {
3912 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
3913 RpcResult<VnfGetResourceRequestOutput> rpcResult = RpcResultBuilder
3914 .<VnfGetResourceRequestOutput>status(true).withResult(responseBuilder.build()).build();
3916 return Futures.immediateFuture(rpcResult);
3919 // Got success from SLI
3920 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
3922 if (respProps != null) {
3923 GenericResourceApiUtil.toBuilder(respProps, responseBuilder);
3926 RpcResult<VnfGetResourceRequestOutput> rpcResult = RpcResultBuilder.<VnfGetResourceRequestOutput>status(true)
3927 .withResult(responseBuilder.build()).build();
3930 return Futures.immediateFuture(rpcResult);
3933 private boolean hasInvalidService(VnfGetResourceRequestInput input) {
3934 return input == null || input.getServiceInformation() == null
3935 || input.getServiceInformation().getServiceInstanceId() == null
3936 || input.getServiceInformation().getServiceInstanceId().length() == 0;
3940 public ListenableFuture<RpcResult<CollectPerformanceDataOutput>> collectPerformanceData(CollectPerformanceDataInput input) {
3941 final String svcOperation = "performance-data-collector";
3942 Properties parms = new Properties();
3944 log.info(CALLED_STR, svcOperation);
3945 // create a new response object
3946 CollectPerformanceDataOutputBuilder responseBuilder = new CollectPerformanceDataOutputBuilder();
3948 if (hasInvalidService(input)) {
3949 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
3950 RpcResult<CollectPerformanceDataOutput> rpcResult = RpcResultBuilder
3951 .<CollectPerformanceDataOutput>status(true).withResult(responseBuilder.build()).build();
3953 return Futures.immediateFuture(rpcResult);
3956 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
3957 serviceDataBuilder.setControllerIpv4Address(input.getControllerIpv4Address());
3959 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
3961 log.info(ADDING_INPUT_DATA_LOG, svcOperation, input.getControllerIpv4Address(), input);
3962 CollectPerformanceDataInputBuilder inputBuilder = new CollectPerformanceDataInputBuilder(input);
3963 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
3965 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, input.getControllerIpv4Address(), operDataBuilder.build());
3966 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
3968 // Call SLI sync method
3969 ResponseObject responseObject = new ResponseObject("200", "");
3970 String ackFinal = "Y";
3971 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
3973 if (respProps != null) {
3974 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
3975 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
3976 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
3979 if (failed(responseObject)) {
3980 responseBuilder.setResponseCode(responseObject.getStatusCode());
3981 responseBuilder.setResponseMessage(responseObject.getMessage());
3982 responseBuilder.setAckFinalIndicator(ackFinal);
3984 log.error(RETURNED_FAILED_MESSAGE, svcOperation, input.getControllerIpv4Address(), responseBuilder.build());
3985 RpcResult<CollectPerformanceDataOutput> rpcResult = RpcResultBuilder
3986 .<CollectPerformanceDataOutput>status(true).withResult(responseBuilder.build()).build();
3988 return Futures.immediateFuture(rpcResult);
3991 // Got success from SLI
3992 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, input.getControllerIpv4Address(), responseBuilder.build());
3994 if (respProps != null) {
3995 GenericResourceApiUtil.toBuilder(respProps, responseBuilder);
3998 RpcResult<CollectPerformanceDataOutput> rpcResult = RpcResultBuilder.<CollectPerformanceDataOutput>status(true)
3999 .withResult(responseBuilder.build()).build();
4002 return Futures.immediateFuture(rpcResult);
4005 private boolean hasInvalidService(CollectPerformanceDataInput input) {
4006 return input == null || input.getControllerIpv4Address() == null;