1 package org.onap.sdnc.northbound;
3 import com.google.common.base.Optional;
4 import com.google.common.util.concurrent.CheckedFuture;
5 import com.google.common.util.concurrent.Futures;
6 import java.text.DateFormat;
7 import java.text.SimpleDateFormat;
9 import java.util.Properties;
10 import java.util.TimeZone;
11 import java.util.concurrent.ExecutionException;
12 import java.util.concurrent.ExecutorService;
13 import java.util.concurrent.Executors;
14 import java.util.concurrent.Future;
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
16 import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
17 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
18 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
19 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
20 import org.opendaylight.controller.md.sal.common.api.data.OptimisticLockFailedException;
21 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
22 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
23 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
24 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.BrgTopologyOperationInput;
25 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.BrgTopologyOperationInputBuilder;
26 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.BrgTopologyOperationOutput;
27 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.BrgTopologyOperationOutputBuilder;
28 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ConnectionAttachmentTopologyOperationInput;
29 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ConnectionAttachmentTopologyOperationInputBuilder;
30 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ConnectionAttachmentTopologyOperationOutput;
31 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ConnectionAttachmentTopologyOperationOutputBuilder;
32 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationInput;
33 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationInputBuilder;
34 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationOutput;
35 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationOutputBuilder;
36 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.GENERICRESOURCEAPIService;
37 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.NetworkTopologyOperationInput;
38 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.NetworkTopologyOperationInputBuilder;
39 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.NetworkTopologyOperationOutput;
40 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.NetworkTopologyOperationOutputBuilder;
41 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadNetworkTopologyOperationInput;
42 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadNetworkTopologyOperationInputBuilder;
43 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadNetworkTopologyOperationOutput;
44 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadNetworkTopologyOperationOutputBuilder;
45 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadVnfTopologyOperationInput;
46 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadVnfTopologyOperationInputBuilder;
47 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadVnfTopologyOperationOutput;
48 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadVnfTopologyOperationOutputBuilder;
49 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadVnfs;
50 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadVnfsBuilder;
51 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.SecurityZoneTopologyOperationInput;
52 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.SecurityZoneTopologyOperationInputBuilder;
53 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.SecurityZoneTopologyOperationOutput;
54 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.SecurityZoneTopologyOperationOutputBuilder;
55 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServiceTopologyOperationInput;
56 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServiceTopologyOperationInputBuilder;
57 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServiceTopologyOperationOutput;
58 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServiceTopologyOperationOutputBuilder;
59 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.Services;
60 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServicesBuilder;
61 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.TunnelxconnTopologyOperationInput;
62 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.TunnelxconnTopologyOperationInputBuilder;
63 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.TunnelxconnTopologyOperationOutput;
64 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.TunnelxconnTopologyOperationOutputBuilder;
65 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VfModuleTopologyOperationInput;
66 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VfModuleTopologyOperationInputBuilder;
67 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VfModuleTopologyOperationOutput;
68 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VfModuleTopologyOperationOutputBuilder;
69 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfTopologyOperationInput;
70 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfTopologyOperationInputBuilder;
71 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfTopologyOperationOutput;
72 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfTopologyOperationOutputBuilder;
73 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.brg.response.information.BrgResponseInformationBuilder;
74 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.connection.attachment.response.information.ConnectionAttachmentResponseInformationBuilder;
75 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.contrail.route.response.information.ContrailRouteResponseInformationBuilder;
76 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.network.response.information.NetworkResponseInformationBuilder;
77 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.data.PreloadData;
78 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.data.PreloadDataBuilder;
79 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.model.information.VnfPreloadList;
80 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.model.information.VnfPreloadListBuilder;
81 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.model.information.VnfPreloadListKey;
82 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.request.information.RequestInformation;
83 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.sdnc.request.header.SdncRequestHeader;
84 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.sdnc.request.header.SdncRequestHeader.SvcAction;
85 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.security.zone.response.information.SecurityZoneResponseInformationBuilder;
86 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.data.ServiceData;
87 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.data.ServiceDataBuilder;
88 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.model.infrastructure.Service;
89 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.model.infrastructure.ServiceBuilder;
90 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.model.infrastructure.ServiceKey;
91 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.response.information.ServiceResponseInformationBuilder;
92 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.status.ServiceStatus.RequestStatus;
93 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.status.ServiceStatus.RpcAction;
94 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.status.ServiceStatusBuilder;
95 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.tunnelxconn.response.information.TunnelxconnResponseInformationBuilder;
96 import org.opendaylight.yangtools.yang.binding.DataObject;
97 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
98 import org.opendaylight.yangtools.yang.common.RpcResult;
99 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
100 import org.slf4j.Logger;
101 import org.slf4j.LoggerFactory;
104 * Defines a base implementation for your provider. This class extends from a helper class which provides storage for
105 * the most commonly used components of the MD-SAL. Additionally the base class provides some basic logging and
106 * initialization / clean up methods.
108 * To use this, copy and paste (overwrite) the following method into the TestApplicationProviderModule class which is
109 * auto generated under src/main/java in this project (created only once during first compilation):
114 * public java.lang.AutoCloseable createInstance() {
116 * // final GENERIC-RESOURCE-APIProvider provider = new
117 * // GENERIC-RESOURCE-APIProvider();
118 * final GenericResourceApiProvider provider = new GenericResourceApiProvider();
119 * provider.setDataBroker(getDataBrokerDependency());
120 * provider.setNotificationService(getNotificationServiceDependency());
121 * provider.setRpcRegistry(getRpcRegistryDependency());
122 * provider.initialize();
123 * return new AutoCloseable() {
126 * public void close() throws Exception {
127 * // TODO: CLOSE ANY REGISTRATION OBJECTS CREATED USING ABOVE
128 * // BROKER/NOTIFICATION
129 * // SERVIE/RPC REGISTRY
138 public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURCEAPIService {
140 protected static final String APP_NAME = "generic-resource-api";
141 private static final String CALLED_STR = "{} called.";
142 private static final String NULL_OR_EMPTY_ERROR_MESSAGE = "exiting {} because of null or empty service-instance-id";
143 protected static final String NULL_OR_EMPTY_ERROR_PARAM = "invalid input, null or empty service-instance-id";
144 private static final String ADDING_INPUT_DATA_LOG = "Adding INPUT data for {} [{}] input: {}";
145 private static final String ADDING_OPERATIONAL_DATA_LOG = "Adding OPERATIONAL data for {} [{}] operational-data: {}";
146 private static final String OPERATIONAL_DATA_PARAM = "operational-data";
147 protected static final String NO_SERVICE_LOGIC_ACTIVE = "No service logic active for ";
148 private static final String SERVICE_LOGIC_SEARCH_ERROR_MESSAGE = "Caught exception looking for service logic";
149 private static final String ERROR_CODE_PARAM = "error-code";
150 private static final String ERROR_MESSAGE_PARAM = "error-message";
151 private static final String ACK_FINAL_PARAM = "ack-final";
152 private static final String SERVICE_OBJECT_PATH_PARAM = "service-object-path";
153 private static final String UPDATING_MDSAL_ERROR_MESSAGE = "Caught Exception updating MD-SAL for {} [{}] \n";
154 private static final String UPDATING_MDSAL_ERROR_MESSAGE_2 = "Caught Exception updating MD-SAL for {} [{},{}] \n";
155 private static final String RETURNED_FAILED_MESSAGE = "Returned FAILED for {} [{}] {}";
156 private static final String UPDATING_MDSAL_INFO_MESSAGE = "Updating MD-SAL for {} [{}] ServiceData: {}";
157 private static final String UPDATED_MDSAL_INFO_MESSAGE = "Updated MD-SAL for {} [{}]";
158 private static final String RETURNED_SUCCESS_MESSAGE = "Returned SUCCESS for {} [{}] {}";
159 private static final String NON_NULL_PARAM = "non-null";
160 private static final String NULL_PARAM = "null";
161 private static final String SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE = "Caught exception executing service logic for {} ";
162 private static final String UPDATING_TREE_INFO_MESSAGE = "Updating OPERATIONAL tree.";
163 private static final String EMPTY_SERVICE_INSTANCE_MESSAGE = "exiting {} because the service-instance does not have any service data in SDNC";
164 protected static final String INVALID_INPUT_ERROR_MESSAGE = "invalid input: the service-instance does not have any service data in SDNC";
165 private static final String ALLOTTED_RESOURCE_ID_PARAM = "allotted-resource-id";
166 private static final String ERROR_NETWORK_ID = "error";
168 private final Logger log = LoggerFactory.getLogger(GenericResourceApiProvider.class);
169 private final ExecutorService executor;
170 private final GenericResourceApiSvcLogicServiceClient svcLogicClient;
172 protected DataBroker dataBroker;
173 protected NotificationPublishService notificationService;
174 protected RpcProviderRegistry rpcRegistry;
175 protected BindingAwareBroker.RpcRegistration<GENERICRESOURCEAPIService> rpcRegistration;
177 public GenericResourceApiProvider(
178 DataBroker dataBroker,
179 NotificationPublishService notificationPublishService,
180 RpcProviderRegistry rpcProviderRegistry,
181 GenericResourceApiSvcLogicServiceClient client
183 log.info("Creating provider for {}", APP_NAME);
184 executor = Executors.newFixedThreadPool(1);
185 setDataBroker(dataBroker);
186 setNotificationService(notificationPublishService);
187 setRpcRegistry(rpcProviderRegistry);
188 svcLogicClient = client;
193 public void initialize() {
194 log.info("Initializing provider for {}", APP_NAME);
195 // Create the top level containers
198 GenericResourceApiUtil.loadProperties();
199 } catch (Exception e) {
200 log.error("Caught Exception while trying to load properties file", e);
203 log.info("Initialization complete for {}", APP_NAME);
206 protected void initializeChild() {
207 // Override if you have custom initialization intelligence
211 public void close() throws Exception {
212 log.info("Closing provider for {}", APP_NAME);
214 rpcRegistration.close();
215 log.info("Successfully closed provider for {}", APP_NAME);
218 private static class Iso8601Util {
220 private static TimeZone timeZone = TimeZone.getTimeZone("UTC");
221 private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
223 private Iso8601Util() {
227 dateFormat.setTimeZone(timeZone);
230 private static String now() {
231 return dateFormat.format(new Date());
235 public void setDataBroker(DataBroker dataBroker) {
236 this.dataBroker = dataBroker;
237 if (log.isDebugEnabled()) {
238 log.debug("DataBroker set to {}", dataBroker == null ? NULL_PARAM : NON_NULL_PARAM);
242 public void setNotificationService(NotificationPublishService notificationService) {
243 this.notificationService = notificationService;
244 if (log.isDebugEnabled()) {
245 log.debug("Notification Service set to {}", notificationService == null ? NULL_PARAM : NON_NULL_PARAM);
249 public void setRpcRegistry(RpcProviderRegistry rpcRegistry) {
250 this.rpcRegistry = rpcRegistry;
251 if (log.isDebugEnabled()) {
252 log.debug("RpcRegistry set to {}", rpcRegistry == null ? NULL_PARAM : NON_NULL_PARAM);
256 private void createContainers() {
258 final WriteTransaction t = dataBroker.newReadWriteTransaction();
260 // Create the service-instance container
261 t.merge(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Services.class),
262 new ServicesBuilder().build());
263 t.merge(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Services.class),
264 new ServicesBuilder().build());
266 // Create the PreloadVnfs container
267 t.merge(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(PreloadVnfs.class),
268 new PreloadVnfsBuilder().build());
269 t.merge(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(PreloadVnfs.class),
270 new PreloadVnfsBuilder().build());
273 CheckedFuture<Void, TransactionCommitFailedException> checkedFuture = t.submit();
275 log.info("Create containers succeeded!");
277 } catch (InterruptedException | ExecutionException e) {
278 log.error("Create containers failed: ", e);
282 private void setServiceStatus(ServiceStatusBuilder serviceStatusBuilder, String errorCode, String errorMessage,
284 serviceStatusBuilder.setResponseCode(errorCode);
285 serviceStatusBuilder.setResponseMessage(errorMessage);
286 serviceStatusBuilder.setFinalIndicator(ackFinal);
287 serviceStatusBuilder.setResponseTimestamp(Iso8601Util.now());
290 private void setServiceStatus(ServiceStatusBuilder serviceStatusBuilder, RequestInformation requestInformation) {
291 if (requestInformation != null && requestInformation.getRequestAction() != null) {
292 serviceStatusBuilder.setAction(requestInformation.getRequestAction().toString());
296 private void setServiceStatus(ServiceStatusBuilder serviceStatusBuilder, SdncRequestHeader requestHeader) {
297 if (requestHeader != null && requestHeader.getSvcAction() != null) {
298 switch (requestHeader.getSvcAction()) {
300 serviceStatusBuilder.setRpcAction(RpcAction.Assign);
303 serviceStatusBuilder.setRpcAction(RpcAction.Unassign);
306 serviceStatusBuilder.setRpcAction(RpcAction.Activate);
309 serviceStatusBuilder.setRpcAction(RpcAction.Deactivate);
312 serviceStatusBuilder.setRpcAction(RpcAction.Delete);
315 log.error("Unknown SvcAction: {}", requestHeader.getSvcAction());
321 private void getServiceData(String siid, ServiceDataBuilder serviceDataBuilder) {
323 getServiceData(siid, serviceDataBuilder, LogicalDatastoreType.CONFIGURATION);
326 private void getServiceData(String siid, ServiceDataBuilder serviceDataBuilder, LogicalDatastoreType type) {
327 // See if any data exists yet for this siid, if so grab it.
328 InstanceIdentifier<Service> serviceInstanceIdentifier = InstanceIdentifier
329 .builder(Services.class)
330 .child(Service.class, new ServiceKey(siid))
333 ReadOnlyTransaction readTx = dataBroker.newReadOnlyTransaction();
334 Optional<Service> data = Optional.absent();
336 data = readTx.read(type, serviceInstanceIdentifier).get();
337 } catch (InterruptedException | ExecutionException e) {
338 log.error("Caught Exception reading MD-SAL ({}) data for [{}] ", type, siid, e);
341 if (data != null && data.isPresent()) {
342 ServiceData serviceData = data.get().getServiceData();
343 if (serviceData != null) {
344 log.info("Read MD-SAL ({}) data for [{}] ServiceData: {}", type, siid, serviceData);
345 serviceDataBuilder.setSdncRequestHeader(serviceData.getSdncRequestHeader());
346 serviceDataBuilder.setRequestInformation(serviceData.getRequestInformation());
347 serviceDataBuilder.setServiceInformation(serviceData.getServiceInformation());
348 serviceDataBuilder.setServiceRequestInput(serviceData.getServiceRequestInput());
349 serviceDataBuilder.setServiceTopology(serviceData.getServiceTopology());
350 serviceDataBuilder.setServiceLevelOperStatus(serviceData.getServiceLevelOperStatus());
351 serviceDataBuilder.setNetworks(serviceData.getNetworks());
352 serviceDataBuilder.setVnfs(serviceData.getVnfs());
353 serviceDataBuilder.setProvidedAllottedResources(serviceData.getProvidedAllottedResources());
354 serviceDataBuilder.setConsumedAllottedResources(serviceData.getConsumedAllottedResources());
355 // service-instance-id needs to be set
357 log.info("No service-data found in MD-SAL ({}) for [{}]", type, siid);
360 log.info("No data found in MD-SAL ({}) for [{}]", type, siid);
364 private void getPreloadData(String vnfName, String vnfType, PreloadDataBuilder preloadDataBuilder) {
366 getPreloadData(vnfName, vnfType, preloadDataBuilder, LogicalDatastoreType.CONFIGURATION);
369 private void getPreloadData(String preloadName, String preloadType, PreloadDataBuilder preloadDataBuilder,
370 LogicalDatastoreType type) {
371 // See if any data exists yet for this name/type, if so grab it.
372 InstanceIdentifier<VnfPreloadList> preloadInstanceIdentifier = InstanceIdentifier
373 .builder(PreloadVnfs.class)
374 .child(VnfPreloadList.class, new VnfPreloadListKey(preloadName, preloadType))
377 ReadOnlyTransaction readTx = dataBroker.newReadOnlyTransaction();
378 Optional<VnfPreloadList> data = Optional.absent();
380 data = readTx.read(type, preloadInstanceIdentifier).get();
381 } catch (InterruptedException | ExecutionException e) {
382 log.error("Caught Exception reading MD-SAL ({}) for [{},{}] ", type, preloadName, preloadType, e);
385 if (data != null && data.isPresent()) {
386 PreloadData preloadData = data.get().getPreloadData();
387 if (preloadData != null) {
388 log.info("Read MD-SAL ({}) data for [{},{}] PreloadData: {}", type, preloadName, preloadType,
390 preloadDataBuilder.setVnfTopologyInformation(preloadData.getVnfTopologyInformation());
391 preloadDataBuilder.setNetworkTopologyInformation(preloadData.getNetworkTopologyInformation());
392 preloadDataBuilder.setOperStatus(preloadData.getOperStatus());
394 log.info("No preload-data found in MD-SAL ({}) for [{},{}] ", type, preloadName, preloadType);
397 log.info("No data found in MD-SAL ({}) for [{},{}] ", type, preloadName, preloadType);
401 private void saveService(final Service entry, boolean merge, LogicalDatastoreType storeType) {
402 // Each entry will be identifiable by a unique key, we have to create that
404 InstanceIdentifier<Service> path = InstanceIdentifier
405 .builder(Services.class)
406 .child(Service.class, entry.getKey())
409 trySaveEntry(entry, merge, storeType, path);
412 private void savePreloadList(final VnfPreloadList entry, boolean merge, LogicalDatastoreType storeType) {
414 // Each entry will be identifiable by a unique key, we have to create that
416 InstanceIdentifier<VnfPreloadList> path = InstanceIdentifier
417 .builder(PreloadVnfs.class)
418 .child(VnfPreloadList.class, entry.getKey())
421 trySaveEntry(entry, merge, storeType, path);
424 private <T extends DataObject> void trySaveEntry(T entry, boolean merge, LogicalDatastoreType storeType,
425 InstanceIdentifier<T> path) {
429 save(entry, merge, storeType, path);
431 } catch (OptimisticLockFailedException e) {
433 log.debug("Got OptimisticLockFailedException on last try - failing ");
434 throw new IllegalStateException(e);
436 log.debug("Got OptimisticLockFailedException - trying again ");
437 } catch (TransactionCommitFailedException ex) {
438 log.debug("Update DataStore failed");
439 throw new IllegalStateException(ex);
444 private <T extends DataObject> void save(T entry, boolean merge, LogicalDatastoreType storeType,
445 InstanceIdentifier<T> path)
446 throws TransactionCommitFailedException {
447 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
449 tx.merge(storeType, path, entry);
451 tx.put(storeType, path, entry);
453 tx.submit().checkedGet();
454 log.debug("Update DataStore succeeded");
457 private void deleteService(final Service entry, LogicalDatastoreType storeType) {
458 // Each entry will be identifiable by a unique key, we have to create
460 InstanceIdentifier<Service> path = InstanceIdentifier
461 .builder(Services.class)
462 .child(Service.class, entry.getKey())
465 tryDeleteEntry(storeType, path);
468 private void tryDeleteEntry(LogicalDatastoreType storeType, InstanceIdentifier<Service> path) {
472 delete(storeType, path);
474 } catch (OptimisticLockFailedException e) {
476 log.debug("Got OptimisticLockFailedException on last try - failing ");
477 throw new IllegalStateException(e);
479 log.debug("Got OptimisticLockFailedException - trying again ");
480 } catch (TransactionCommitFailedException ex) {
481 log.debug("Update DataStore failed");
482 throw new IllegalStateException(ex);
487 private void delete(LogicalDatastoreType storeType, InstanceIdentifier<Service> path)
488 throws TransactionCommitFailedException {
489 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
490 tx.delete(storeType, path);
491 tx.submit().checkedGet();
492 log.debug("DataStore delete succeeded");
496 public Future<RpcResult<ServiceTopologyOperationOutput>> serviceTopologyOperation(
497 ServiceTopologyOperationInput input) {
499 final String svcOperation = "service-topology-operation";
500 ServiceData serviceData;
501 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
502 Properties parms = new Properties();
504 log.info(CALLED_STR, svcOperation);
505 // create a new response object
506 ServiceTopologyOperationOutputBuilder responseBuilder = new ServiceTopologyOperationOutputBuilder();
508 if (hasInvalidServiceId(input)) {
509 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
510 responseBuilder.setResponseCode("404");
511 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
512 responseBuilder.setAckFinalIndicator("Y");
514 RpcResult<ServiceTopologyOperationOutput> rpcResult = RpcResultBuilder
515 .<ServiceTopologyOperationOutput>status(true)
516 .withResult(responseBuilder.build())
519 return Futures.immediateFuture(rpcResult);
522 // Grab the service instance ID from the input buffer
523 String siid = input.getServiceInformation().getServiceInstanceId();
525 trySetSvcRequestId(input, responseBuilder);
527 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
528 getServiceData(siid, serviceDataBuilder);
530 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
531 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
533 // Set the serviceStatus based on input
534 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
535 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
538 * // setup a service-data object builder // ACTION service-topology-operation
539 * // INPUT: // USES uses service-operation-information // OUTPUT: // uses
540 * topology-response-common; // uses service-response-information;
543 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
544 ServiceTopologyOperationInputBuilder inputBuilder = new ServiceTopologyOperationInputBuilder(input);
545 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
547 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid,
548 operDataBuilder.build());
549 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
551 // Call SLI sync method
552 // Get SvcLogicService reference
554 ResponseObject responseObject = new ResponseObject("200", "");
555 String ackFinal = "Y";
556 String serviceObjectPath = null;
557 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
559 if (respProps != null) {
560 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
561 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
562 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
563 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
566 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
567 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
568 serviceStatusBuilder.setRpcName(svcOperation);
570 if (failed(responseObject)) {
571 responseBuilder.setResponseCode(responseObject.getStatusCode());
572 responseBuilder.setResponseMessage(responseObject.getMessage());
573 responseBuilder.setAckFinalIndicator(ackFinal);
575 ServiceBuilder serviceBuilder = new ServiceBuilder();
576 serviceBuilder.setServiceInstanceId(siid);
577 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
579 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
580 } catch (Exception e) {
581 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
583 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
585 RpcResult<ServiceTopologyOperationOutput> rpcResult = RpcResultBuilder
586 .<ServiceTopologyOperationOutput>status(true)
587 .withResult(responseBuilder.build())
590 return Futures.immediateFuture(rpcResult);
593 // Got success from SLI
595 serviceData = serviceDataBuilder.build();
596 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
599 ServiceBuilder serviceBuilder = new ServiceBuilder();
600 serviceBuilder.setServiceData(serviceData);
601 serviceBuilder.setServiceInstanceId(siid);
602 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
603 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
605 tryDeleteService(input, serviceBuilder);
607 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
608 serviceResponseInformationBuilder.setInstanceId(siid);
609 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
610 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
612 } catch (Exception e) {
613 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
614 responseBuilder.setResponseCode("500");
615 responseBuilder.setResponseMessage(e.getMessage());
616 responseBuilder.setAckFinalIndicator("Y");
617 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
619 RpcResult<ServiceTopologyOperationOutput> rpcResult = RpcResultBuilder
620 .<ServiceTopologyOperationOutput>status(true)
621 .withResult(responseBuilder.build())
624 return Futures.immediateFuture(rpcResult);
628 responseBuilder.setResponseCode(responseObject.getStatusCode());
629 responseBuilder.setAckFinalIndicator(ackFinal);
630 trySetResponseMessage(responseBuilder, responseObject);
631 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
632 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
634 RpcResult<ServiceTopologyOperationOutput> rpcResult = RpcResultBuilder
635 .<ServiceTopologyOperationOutput>status(true)
636 .withResult(responseBuilder.build())
639 return Futures.immediateFuture(rpcResult);
642 private void trySetResponseMessage(ServiceTopologyOperationOutputBuilder responseBuilder, ResponseObject error) {
643 if (!error.getMessage().isEmpty()) {
644 responseBuilder.setResponseMessage(error.getMessage());
648 private boolean hasInvalidServiceId(ServiceTopologyOperationInput input) {
649 return input == null || input.getServiceInformation() == null
650 || input.getServiceInformation().getServiceInstanceId() == null
651 || input.getServiceInformation().getServiceInstanceId().length() == 0;
654 private void trySetSvcRequestId(ServiceTopologyOperationInput input,
655 ServiceTopologyOperationOutputBuilder responseBuilder) {
656 if (input.getSdncRequestHeader() != null) {
657 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
661 private void tryDeleteService(ServiceTopologyOperationInput input, ServiceBuilder serviceBuilder) {
662 if (isValidRequest(input) && input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete)) {
663 // Only update operational tree on delete
664 log.info("Delete from both CONFIGURATION and OPERATIONAL tree.");
665 deleteService(serviceBuilder.build(), LogicalDatastoreType.OPERATIONAL);
666 deleteService(serviceBuilder.build(), LogicalDatastoreType.CONFIGURATION);
670 private Properties tryGetProperties(String svcOperation, Properties parms, ServiceDataBuilder serviceDataBuilder,
671 ResponseObject responseObject) {
673 if (svcLogicClient.hasGraph(APP_NAME, svcOperation, null, "sync")) {
675 return svcLogicClient.execute(APP_NAME, svcOperation, null, "sync", serviceDataBuilder, parms);
676 } catch (Exception e) {
677 log.error(SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE, svcOperation, e);
678 responseObject.setMessage(e.getMessage());
679 responseObject.setStatusCode("500");
682 responseObject.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
683 responseObject.setStatusCode("503");
685 } catch (Exception e) {
686 responseObject.setMessage(e.getMessage());
687 responseObject.setStatusCode("500");
688 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
694 private boolean failed(ResponseObject error) {
696 !error.getStatusCode().isEmpty() && !("0".equals(error.getStatusCode()) || "200"
697 .equals(error.getStatusCode()));
700 private boolean isValidRequest(ServiceTopologyOperationInput input) {
701 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
705 public Future<RpcResult<VnfTopologyOperationOutput>> vnfTopologyOperation(VnfTopologyOperationInput input) {
707 final String svcOperation = "vnf-topology-operation";
708 ServiceData serviceData;
709 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
710 Properties properties = new Properties();
712 log.info(CALLED_STR, svcOperation);
713 // create a new response object
714 VnfTopologyOperationOutputBuilder responseBuilder = new VnfTopologyOperationOutputBuilder();
716 if (hasInvalidServiceId(input)) {
718 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
719 responseBuilder.setResponseCode("404");
720 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
721 responseBuilder.setAckFinalIndicator("Y");
722 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<VnfTopologyOperationOutput>status(true)
723 .withResult(responseBuilder.build()).build();
725 return Futures.immediateFuture(rpcResult);
728 // Grab the service instance ID from the input buffer
729 String siid = input.getServiceInformation().getServiceInstanceId();
731 trySetSvcRequestId(input, responseBuilder);
733 if (hasInvalidVnfId(input)) {
734 log.debug("exiting {} because of null or empty vnf-id", svcOperation);
735 responseBuilder.setResponseCode("404");
736 responseBuilder.setResponseMessage("invalid input, null or empty vnf-id");
737 responseBuilder.setAckFinalIndicator("Y");
739 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder
740 .<VnfTopologyOperationOutput>status(true)
741 .withResult(responseBuilder.build())
744 return Futures.immediateFuture(rpcResult);
747 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
748 getServiceData(siid, serviceDataBuilder);
750 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
751 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
753 // Set the serviceStatus based on input
754 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
755 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
758 // setup a service-data object builder
759 // ACTION vnf-topology-operation
761 // USES sdnc-request-header;
762 // USES request-information;
763 // USES service-information;
764 // USES vnf-request-information
766 // USES vnf-topology-response-body;
767 // USES vnf-information
768 // USES service-information
770 // container service-data
771 // uses vnf-configuration-information;
774 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
775 VnfTopologyOperationInputBuilder inputBuilder = new VnfTopologyOperationInputBuilder(input);
776 GenericResourceApiUtil.toProperties(properties, inputBuilder.build());
778 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid,
779 operDataBuilder.build());
780 GenericResourceApiUtil.toProperties(properties, OPERATIONAL_DATA_PARAM, operDataBuilder);
782 // Call SLI sync method
783 // Get SvcLogicService reference
785 ResponseObject responseObject = new ResponseObject("200", "");
786 String ackFinal = "Y";
787 String serviceObjectPath = null;
788 Properties respProps = tryGetProperties(svcOperation, properties, serviceDataBuilder, responseObject);
790 if (respProps != null) {
791 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
792 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
793 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
796 /*before was "vfn-object-path", but it didn't make sense, since everywhere else,
797 when extracting service object path the "service-object-path" property is used*/
798 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
801 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
802 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
803 serviceStatusBuilder.setRpcName(svcOperation);
805 if (failed(responseObject)) {
806 responseBuilder.setResponseCode(responseObject.getStatusCode());
807 responseBuilder.setResponseMessage(responseObject.getMessage());
808 responseBuilder.setAckFinalIndicator(ackFinal);
810 ServiceBuilder serviceBuilder = new ServiceBuilder();
811 serviceBuilder.setServiceInstanceId(siid);
812 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
814 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
815 trySaveService(input, serviceBuilder);
816 } catch (Exception e) {
817 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
819 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
821 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder
822 .<VnfTopologyOperationOutput>status(true)
823 .withResult(responseBuilder.build())
827 return Futures.immediateFuture(rpcResult);
830 // Got success from SLI
832 serviceData = serviceDataBuilder.build();
833 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
836 ServiceBuilder serviceBuilder = new ServiceBuilder();
837 serviceBuilder.setServiceData(serviceData);
838 serviceBuilder.setServiceInstanceId(siid);
839 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
840 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
842 if (isValidRequest(input) && input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)) {
843 // Only update operational tree on Assign
845 log.info(UPDATING_TREE_INFO_MESSAGE);
846 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
849 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
850 serviceResponseInformationBuilder.setInstanceId(siid);
851 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
852 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
854 } catch (Exception e) {
855 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
856 responseBuilder.setResponseCode("500");
857 responseBuilder.setResponseMessage(e.getMessage());
858 responseBuilder.setAckFinalIndicator("Y");
859 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
861 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder
862 .<VnfTopologyOperationOutput>status(true)
863 .withResult(responseBuilder.build())
866 return Futures.immediateFuture(rpcResult);
870 responseBuilder.setResponseCode(responseObject.getStatusCode());
871 responseBuilder.setAckFinalIndicator(ackFinal);
872 trySetResponseMessage(responseBuilder, responseObject);
873 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
874 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
876 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder
877 .<VnfTopologyOperationOutput>status(true)
878 .withResult(responseBuilder.build())
882 return Futures.immediateFuture(rpcResult);
885 private void trySetResponseMessage(VnfTopologyOperationOutputBuilder responseBuilder, ResponseObject error) {
886 if (!error.getMessage().isEmpty()) {
887 responseBuilder.setResponseMessage(error.getMessage());
891 private void trySaveService(VnfTopologyOperationInput input, ServiceBuilder serviceBuilder) {
892 if (isValidRequest(input) &&
893 (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete) ||
894 input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
896 // Only update operational tree on activate or delete
897 log.info(UPDATING_TREE_INFO_MESSAGE);
898 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
902 private boolean hasInvalidVnfId(VnfTopologyOperationInput input) {
903 return input.getVnfInformation() == null || input.getVnfInformation().getVnfId() == null
904 || input.getVnfInformation().getVnfId().length() == 0;
907 private boolean hasInvalidServiceId(VnfTopologyOperationInput input) {
908 return input == null || input.getServiceInformation() == null
909 || input.getServiceInformation().getServiceInstanceId() == null
910 || input.getServiceInformation().getServiceInstanceId().length() == 0;
913 private void trySetSvcRequestId(VnfTopologyOperationInput input,
914 VnfTopologyOperationOutputBuilder responseBuilder) {
915 if (input.getSdncRequestHeader() != null) {
916 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
920 private boolean isValidRequest(VnfTopologyOperationInput input) {
921 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
925 public Future<RpcResult<VfModuleTopologyOperationOutput>> vfModuleTopologyOperation(
926 VfModuleTopologyOperationInput input) {
928 final String svcOperation = "vf-module-topology-operation";
929 ServiceData serviceData;
930 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
931 Properties parms = new Properties();
933 log.info(CALLED_STR, svcOperation);
934 // create a new response object
935 VfModuleTopologyOperationOutputBuilder responseBuilder = new VfModuleTopologyOperationOutputBuilder();
937 if (hasInvalidServiceId(input)) {
938 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
939 responseBuilder.setResponseCode("403");
940 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
941 responseBuilder.setAckFinalIndicator("Y");
943 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
944 .<VfModuleTopologyOperationOutput>status(true)
945 .withResult(responseBuilder.build())
949 return Futures.immediateFuture(rpcResult);
952 if (hasInvalidVnfId(input)) {
953 log.debug("exiting {} because of null or empty vnf-id", svcOperation);
954 responseBuilder.setResponseCode("403");
955 responseBuilder.setResponseMessage("invalid input, null or empty vnf-id");
956 responseBuilder.setAckFinalIndicator("Y");
957 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
958 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
959 return Futures.immediateFuture(rpcResult);
962 if (hasInvalidVfModuleId(input)) {
963 log.debug("exiting {} because of null or empty vf-module-id", svcOperation);
964 responseBuilder.setResponseCode("403");
965 responseBuilder.setResponseMessage("invalid input, vf-module-id is null or empty");
966 responseBuilder.setAckFinalIndicator("Y");
968 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
969 .<VfModuleTopologyOperationOutput>status(true)
970 .withResult(responseBuilder.build())
973 return Futures.immediateFuture(rpcResult);
976 // Grab the service instance ID from the input buffer
977 String siid = input.getServiceInformation().getServiceInstanceId();
979 trySetSvcRequestId(input, responseBuilder);
981 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
982 getServiceData(siid, serviceDataBuilder);
984 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
985 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
987 // Set the serviceStatus based on input
988 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
989 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
992 // setup a service-data object builder
993 // ACTION vnf-topology-operation
995 // USES sdnc-request-header;
996 // USES request-information;
997 // USES service-information;
998 // USES vnf-request-information
1000 // USES vnf-topology-response-body;
1001 // USES vnf-information
1002 // USES service-information
1004 // container service-data
1005 // uses vnf-configuration-information;
1006 // uses oper-status;
1008 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
1009 VfModuleTopologyOperationInputBuilder inputBuilder = new VfModuleTopologyOperationInputBuilder(input);
1010 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1012 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid,
1013 operDataBuilder.build());
1014 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
1016 // Call SLI sync method
1017 // Get SvcLogicService reference
1019 ResponseObject responseObject = new ResponseObject("200", "");
1020 String ackFinal = "Y";
1021 String serviceObjectPath = null;
1022 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
1024 if (respProps != null) {
1025 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1026 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1027 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1031 /*before was "vf-module-object-path", but it didnt make sense, since everywhere else,
1032 when extracting service object path the "service-object-path" property is used*/
1033 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1036 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
1037 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
1038 serviceStatusBuilder.setRpcName(svcOperation);
1040 if (failed(responseObject)) {
1041 responseBuilder.setResponseCode(responseObject.getStatusCode());
1042 responseBuilder.setResponseMessage(responseObject.getMessage());
1043 responseBuilder.setAckFinalIndicator(ackFinal);
1045 ServiceBuilder serviceBuilder = new ServiceBuilder();
1046 serviceBuilder.setServiceInstanceId(siid);
1047 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1049 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
1050 } catch (Exception e) {
1051 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1053 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1055 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1056 .<VfModuleTopologyOperationOutput>status(true)
1057 .withResult(responseBuilder.build())
1061 return Futures.immediateFuture(rpcResult);
1064 // Got success from SLI
1066 serviceData = serviceDataBuilder.build();
1067 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
1070 ServiceBuilder serviceBuilder = new ServiceBuilder();
1071 serviceBuilder.setServiceData(serviceData);
1072 serviceBuilder.setServiceInstanceId(siid);
1073 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1074 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1076 trySaveService(input, serviceBuilder);
1078 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1079 serviceResponseInformationBuilder.setInstanceId(siid);
1080 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1081 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1083 } catch (Exception e) {
1084 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1085 responseBuilder.setResponseCode("500");
1086 responseBuilder.setResponseMessage(e.getMessage());
1087 responseBuilder.setAckFinalIndicator("Y");
1088 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1090 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1091 .<VfModuleTopologyOperationOutput>status(true)
1092 .withResult(responseBuilder.build())
1095 return Futures.immediateFuture(rpcResult);
1099 responseBuilder.setResponseCode(responseObject.getStatusCode());
1100 responseBuilder.setAckFinalIndicator(ackFinal);
1101 trySetResponseMessage(responseBuilder, responseObject);
1102 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
1103 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
1105 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1106 .<VfModuleTopologyOperationOutput>status(true)
1107 .withResult(responseBuilder.build())
1111 return Futures.immediateFuture(rpcResult);
1114 private void trySetResponseMessage(VfModuleTopologyOperationOutputBuilder responseBuilder, ResponseObject error) {
1115 if (!error.getMessage().isEmpty()) {
1116 responseBuilder.setResponseMessage(error.getMessage());
1120 private void trySaveService(VfModuleTopologyOperationInput input, ServiceBuilder serviceBuilder) {
1121 if (isValidRequest(input) &&
1122 (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign) ||
1123 input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
1124 // Only update operational tree on activate or delete
1126 log.info(UPDATING_TREE_INFO_MESSAGE);
1127 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1131 private void trySetSvcRequestId(VfModuleTopologyOperationInput input,
1132 VfModuleTopologyOperationOutputBuilder responseBuilder) {
1133 if (input.getSdncRequestHeader() != null) {
1134 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1138 private boolean hasInvalidVfModuleId(VfModuleTopologyOperationInput input) {
1139 return input.getVfModuleInformation() == null || input.getVfModuleInformation().getVfModuleId() == null
1140 || input.getVfModuleInformation().getVfModuleId().length() == 0;
1143 private boolean hasInvalidVnfId(VfModuleTopologyOperationInput input) {
1144 return input.getVnfInformation() == null || input.getVnfInformation().getVnfId() == null
1145 || input.getVnfInformation().getVnfId().length() == 0;
1148 private boolean hasInvalidServiceId(VfModuleTopologyOperationInput input) {
1149 return input == null || input.getServiceInformation() == null
1150 || input.getServiceInformation().getServiceInstanceId() == null
1151 || input.getServiceInformation().getServiceInstanceId().length() == 0;
1154 private boolean isValidRequest(VfModuleTopologyOperationInput input) {
1155 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
1159 public Future<RpcResult<NetworkTopologyOperationOutput>> networkTopologyOperation(
1160 NetworkTopologyOperationInput input) {
1162 final String svcOperation = "network-topology-operation";
1163 ServiceData serviceData;
1164 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1165 Properties parms = new Properties();
1167 log.info(CALLED_STR, svcOperation);
1168 // create a new response object
1169 NetworkTopologyOperationOutputBuilder responseBuilder = new NetworkTopologyOperationOutputBuilder();
1171 if (hasInvalidServiceId(input)) {
1172 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
1173 return buildRpcResultFuture(responseBuilder, NULL_OR_EMPTY_ERROR_PARAM);
1176 String siid = input.getServiceInformation().getServiceInstanceId();
1178 // Get the service-instance service data from MD-SAL
1179 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1180 getServiceData(siid, serviceDataBuilder);
1182 this.trySetSvcRequestId(input, responseBuilder);
1184 ServiceData sd = serviceDataBuilder.build();
1185 if (isInvalidServiceData(sd)) {
1186 log.debug(EMPTY_SERVICE_INSTANCE_MESSAGE, svcOperation);
1187 return buildRpcResultFuture(responseBuilder, INVALID_INPUT_ERROR_MESSAGE);
1190 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
1191 NetworkTopologyOperationInputBuilder inputBuilder = new NetworkTopologyOperationInputBuilder(input);
1192 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1194 // Call SLI sync method
1195 // Get SvcLogicService reference
1197 ResponseObject responseObject = new ResponseObject("200", "");
1198 String ackFinal = "Y";
1199 String networkId = ERROR_NETWORK_ID;
1200 String serviceObjectPath = null;
1201 String networkObjectPath = null;
1202 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
1204 if (respProps != null) {
1205 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1206 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1207 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1208 networkId = respProps.getProperty("networkId");
1209 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1210 networkObjectPath = respProps.getProperty("network-object-path");
1213 if (failed(responseObject)) {
1214 responseBuilder.setResponseCode(responseObject.getStatusCode());
1215 responseBuilder.setResponseMessage(responseObject.getMessage());
1216 responseBuilder.setAckFinalIndicator(ackFinal);
1218 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1220 RpcResult<NetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
1221 .<NetworkTopologyOperationOutput>status(true)
1222 .withResult(responseBuilder.build())
1225 return Futures.immediateFuture(rpcResult);
1228 // Got success from SLI
1231 serviceData = serviceDataBuilder.build();
1232 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
1235 ServiceBuilder serviceBuilder = new ServiceBuilder();
1236 serviceBuilder.setServiceData(serviceData);
1237 serviceBuilder.setServiceInstanceId(siid);
1238 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1239 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1241 trySaveService(input, serviceBuilder);
1243 NetworkResponseInformationBuilder networkResponseInformationBuilder = new NetworkResponseInformationBuilder();
1244 networkResponseInformationBuilder.setInstanceId(networkId);
1245 networkResponseInformationBuilder.setObjectPath(networkObjectPath);
1246 responseBuilder.setNetworkResponseInformation(networkResponseInformationBuilder.build());
1248 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1249 serviceResponseInformationBuilder.setInstanceId(siid);
1250 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1251 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1253 } catch (IllegalStateException e) {
1254 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1255 responseBuilder.setResponseCode("500");
1256 responseBuilder.setResponseMessage(e.getMessage());
1257 responseBuilder.setAckFinalIndicator("Y");
1258 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1260 RpcResult<NetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
1261 .<NetworkTopologyOperationOutput>status(true)
1262 .withResult(responseBuilder.build())
1265 return Futures.immediateFuture(rpcResult);
1269 responseBuilder.setResponseCode(responseObject.getStatusCode());
1270 responseBuilder.setAckFinalIndicator(ackFinal);
1271 trySetResponseMessage(responseBuilder, responseObject);
1272 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
1273 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
1275 RpcResult<NetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
1276 .<NetworkTopologyOperationOutput>status(true)
1277 .withResult(responseBuilder.build())
1280 return Futures.immediateFuture(rpcResult);
1283 private void trySetResponseMessage(NetworkTopologyOperationOutputBuilder responseBuilder, ResponseObject error) {
1284 if (!error.getMessage().isEmpty()) {
1285 responseBuilder.setResponseMessage(error.getMessage());
1289 private void trySetSvcRequestId(NetworkTopologyOperationInput input,
1290 NetworkTopologyOperationOutputBuilder responseBuilder) {
1291 if (input.getSdncRequestHeader() != null) {
1292 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1296 private void trySaveService(NetworkTopologyOperationInput input, ServiceBuilder serviceBuilder) {
1297 if (isValidRequest(input) &&
1298 (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate) ||
1299 input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Create))) {
1300 // Only update operational tree on Activate
1301 log.info(UPDATING_TREE_INFO_MESSAGE);
1302 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1306 private boolean hasInvalidServiceId(NetworkTopologyOperationInput input) {
1307 return input == null || input.getServiceInformation() == null
1308 || input.getServiceInformation().getServiceInstanceId() == null
1309 || input.getServiceInformation().getServiceInstanceId().length() == 0;
1312 private Future<RpcResult<NetworkTopologyOperationOutput>> buildRpcResultFuture(
1313 NetworkTopologyOperationOutputBuilder responseBuilder, String responseMessage) {
1315 responseBuilder.setResponseCode("404");
1317 .setResponseMessage(responseMessage);
1318 responseBuilder.setAckFinalIndicator("Y");
1320 RpcResult<NetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
1321 .<NetworkTopologyOperationOutput>status(true)
1322 .withResult(responseBuilder.build())
1325 return Futures.immediateFuture(rpcResult);
1328 private boolean isValidRequest(NetworkTopologyOperationInput input) {
1329 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
1333 public Future<RpcResult<ContrailRouteTopologyOperationOutput>> contrailRouteTopologyOperation(
1334 ContrailRouteTopologyOperationInput input) {
1336 final String svcOperation = "contrail-route-topology-operation";
1337 ServiceData serviceData;
1338 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1339 Properties properties = new Properties();
1341 log.info(CALLED_STR, svcOperation);
1342 // create a new response object
1343 ContrailRouteTopologyOperationOutputBuilder responseBuilder = new ContrailRouteTopologyOperationOutputBuilder();
1345 if (hasInvalidServiceId(input)) {
1346 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
1347 return buildRpcResultFuture(responseBuilder, NULL_OR_EMPTY_ERROR_PARAM);
1350 String siid = input.getServiceInformation().getServiceInstanceId();
1352 // Get the service-instance service data from MD-SAL
1353 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1354 getServiceData(siid, serviceDataBuilder);
1356 trySetSvcRequestId(input, responseBuilder);
1358 ServiceData sd = serviceDataBuilder.build();
1359 if (isInvalidServiceData(sd)) {
1360 log.debug(EMPTY_SERVICE_INSTANCE_MESSAGE, svcOperation);
1361 return buildRpcResultFuture(responseBuilder, INVALID_INPUT_ERROR_MESSAGE);
1364 log.info("Adding INPUT data for " + svcOperation + " [" + siid + "] input: " + input);
1365 ContrailRouteTopologyOperationInputBuilder inputBuilder = new ContrailRouteTopologyOperationInputBuilder(input);
1366 GenericResourceApiUtil.toProperties(properties, inputBuilder.build());
1368 // Call SLI sync method
1369 // Get SvcLogicService reference
1370 ResponseObject error = new ResponseObject("200", "");
1371 String ackFinal = "Y";
1372 String allottedResourceId = ERROR_NETWORK_ID;
1373 String serviceObjectPath = null;
1374 String contrailRouteObjectPath = null;
1375 Properties respProps = tryGetProperties(svcOperation, properties, serviceDataBuilder, error);
1377 if (respProps != null) {
1378 error.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1379 error.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1380 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1381 allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
1382 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1383 contrailRouteObjectPath = respProps.getProperty("contrail-route-object-path");
1386 if (failed(error)) {
1387 responseBuilder.setResponseCode(error.getStatusCode());
1388 responseBuilder.setResponseMessage(error.getMessage());
1389 responseBuilder.setAckFinalIndicator(ackFinal);
1390 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1392 RpcResult<ContrailRouteTopologyOperationOutput> rpcResult = RpcResultBuilder
1393 .<ContrailRouteTopologyOperationOutput>status(true)
1394 .withResult(responseBuilder.build())
1397 return Futures.immediateFuture(rpcResult);
1400 // Got success from SLI
1402 serviceData = serviceDataBuilder.build();
1403 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
1406 ServiceBuilder serviceBuilder = new ServiceBuilder();
1407 serviceBuilder.setServiceData(serviceData);
1408 serviceBuilder.setServiceInstanceId(siid);
1409 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1410 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1412 trySaveService(input, serviceBuilder);
1414 ContrailRouteResponseInformationBuilder contrailRouteResponseInformationBuilder = new ContrailRouteResponseInformationBuilder();
1415 contrailRouteResponseInformationBuilder.setInstanceId(allottedResourceId);
1416 contrailRouteResponseInformationBuilder.setObjectPath(contrailRouteObjectPath);
1417 responseBuilder.setContrailRouteResponseInformation(contrailRouteResponseInformationBuilder.build());
1419 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1420 serviceResponseInformationBuilder.setInstanceId(siid);
1421 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1422 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1424 } catch (IllegalStateException e) {
1425 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1426 responseBuilder.setResponseCode("500");
1427 responseBuilder.setResponseMessage(e.getMessage());
1428 responseBuilder.setAckFinalIndicator("Y");
1429 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1431 RpcResult<ContrailRouteTopologyOperationOutput> rpcResult = RpcResultBuilder
1432 .<ContrailRouteTopologyOperationOutput>status(true)
1433 .withResult(responseBuilder.build())
1436 return Futures.immediateFuture(rpcResult);
1440 responseBuilder.setResponseCode(error.getStatusCode());
1441 responseBuilder.setAckFinalIndicator(ackFinal);
1442 trySetResponseMessage(responseBuilder, error);
1443 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
1444 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
1446 RpcResult<ContrailRouteTopologyOperationOutput> rpcResult = RpcResultBuilder
1447 .<ContrailRouteTopologyOperationOutput>status(true)
1448 .withResult(responseBuilder.build())
1451 return Futures.immediateFuture(rpcResult);
1454 private void trySetResponseMessage(ContrailRouteTopologyOperationOutputBuilder responseBuilder,
1455 ResponseObject error) {
1456 if (!error.getMessage().isEmpty()) {
1457 responseBuilder.setResponseMessage(error.getMessage());
1461 private void trySaveService(ContrailRouteTopologyOperationInput input, ServiceBuilder serviceBuilder) {
1462 if (isValidRequest(input) &&
1463 (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign) ||
1464 input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
1465 // Only update operational tree on activate or delete
1466 log.info(UPDATING_TREE_INFO_MESSAGE);
1467 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1471 private void trySetSvcRequestId(ContrailRouteTopologyOperationInput input,
1472 ContrailRouteTopologyOperationOutputBuilder responseBuilder) {
1473 if (input.getSdncRequestHeader() != null) {
1474 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1478 private boolean hasInvalidServiceId(ContrailRouteTopologyOperationInput input) {
1479 return input == null || input.getServiceInformation() == null
1480 || input.getServiceInformation().getServiceInstanceId() == null
1481 || input.getServiceInformation().getServiceInstanceId().length() == 0;
1484 private Future<RpcResult<ContrailRouteTopologyOperationOutput>>
1485 buildRpcResultFuture(ContrailRouteTopologyOperationOutputBuilder responseBuilder, String responseMessage) {
1487 responseBuilder.setResponseCode("404");
1488 responseBuilder.setResponseMessage(responseMessage);
1489 responseBuilder.setAckFinalIndicator("Y");
1491 RpcResult<ContrailRouteTopologyOperationOutput> rpcResult = RpcResultBuilder
1492 .<ContrailRouteTopologyOperationOutput>status(true)
1493 .withResult(responseBuilder.build())
1496 return Futures.immediateFuture(rpcResult);
1499 private boolean isValidRequest(ContrailRouteTopologyOperationInput input) {
1500 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
1504 public Future<RpcResult<SecurityZoneTopologyOperationOutput>> securityZoneTopologyOperation(
1505 SecurityZoneTopologyOperationInput input) {
1507 final String svcOperation = "security-zone-topology-operation";
1508 ServiceData serviceData;
1509 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1510 Properties parms = new Properties();
1512 log.info(CALLED_STR, svcOperation);
1513 // create a new response object
1514 SecurityZoneTopologyOperationOutputBuilder responseBuilder = new SecurityZoneTopologyOperationOutputBuilder();
1516 if (this.hasInvalidServiceId(input)) {
1517 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
1518 return buildRpcResultFuture(responseBuilder, NULL_OR_EMPTY_ERROR_PARAM);
1521 String siid = input.getServiceInformation().getServiceInstanceId();
1523 // Get the service-instance service data from MD-SAL
1524 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1525 getServiceData(siid, serviceDataBuilder);
1526 trySetSvcRequestId(input, responseBuilder);
1528 ServiceData sd = serviceDataBuilder.build();
1529 if (isInvalidServiceData(sd)) {
1530 log.debug(EMPTY_SERVICE_INSTANCE_MESSAGE, svcOperation);
1531 return buildRpcResultFuture(responseBuilder, INVALID_INPUT_ERROR_MESSAGE);
1534 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
1535 SecurityZoneTopologyOperationInputBuilder inputBuilder = new SecurityZoneTopologyOperationInputBuilder(input);
1536 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1538 // Call SLI sync method
1539 // Get SvcLogicService reference
1541 Properties respProps = null;
1543 ResponseObject responseObject = new ResponseObject("200", "");
1544 String ackFinal = "Y";
1545 String allottedResourceId = ERROR_NETWORK_ID;
1546 String serviceObjectPath = null;
1547 String securityZoneObjectPath = null;
1550 if (svcLogicClient.hasGraph(APP_NAME, svcOperation, null, "sync")) {
1553 respProps = svcLogicClient.execute(APP_NAME, svcOperation, null, "sync", serviceDataBuilder, parms);
1554 } catch (Exception e) {
1555 log.error(SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE, svcOperation, e);
1556 responseObject.setMessage(e.getMessage());
1557 responseObject.setStatusCode("500");
1560 responseObject.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
1561 responseObject.setStatusCode("503");
1563 } catch (Exception e) {
1564 responseObject.setStatusCode("500");
1565 responseObject.setMessage(e.getMessage());
1566 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
1569 if (respProps != null) {
1570 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1571 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1572 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1573 allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
1574 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1575 securityZoneObjectPath = respProps.getProperty("security-zone-object-path");
1578 if (failed(responseObject)) {
1579 responseBuilder.setResponseCode(responseObject.getStatusCode());
1580 responseBuilder.setResponseMessage(responseObject.getMessage());
1581 responseBuilder.setAckFinalIndicator(ackFinal);
1582 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1584 RpcResult<SecurityZoneTopologyOperationOutput> rpcResult = RpcResultBuilder
1585 .<SecurityZoneTopologyOperationOutput>status(true)
1586 .withResult(responseBuilder.build())
1589 return Futures.immediateFuture(rpcResult);
1592 // Got success from SLI
1595 serviceData = serviceDataBuilder.build();
1596 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
1599 ServiceBuilder serviceBuilder = new ServiceBuilder();
1600 serviceBuilder.setServiceData(serviceData);
1601 serviceBuilder.setServiceInstanceId(siid);
1602 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1603 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1605 trySaveService(input, serviceBuilder);
1607 SecurityZoneResponseInformationBuilder securityZoneResponseInformationBuilder = new SecurityZoneResponseInformationBuilder();
1608 securityZoneResponseInformationBuilder.setInstanceId(allottedResourceId);
1609 securityZoneResponseInformationBuilder.setObjectPath(securityZoneObjectPath);
1610 responseBuilder.setSecurityZoneResponseInformation(securityZoneResponseInformationBuilder.build());
1612 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1613 serviceResponseInformationBuilder.setInstanceId(siid);
1614 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1615 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1617 } catch (IllegalStateException e) {
1618 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1619 responseBuilder.setResponseCode("500");
1620 responseBuilder.setResponseMessage(e.getMessage());
1621 responseBuilder.setAckFinalIndicator("Y");
1622 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1624 RpcResult<SecurityZoneTopologyOperationOutput> rpcResult = RpcResultBuilder
1625 .<SecurityZoneTopologyOperationOutput>status(true)
1626 .withResult(responseBuilder.build())
1629 return Futures.immediateFuture(rpcResult);
1633 responseBuilder.setResponseCode(responseObject.getStatusCode());
1634 responseBuilder.setAckFinalIndicator(ackFinal);
1635 trySetResponseMessage(responseBuilder, responseObject);
1636 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
1637 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
1639 RpcResult<SecurityZoneTopologyOperationOutput> rpcResult = RpcResultBuilder
1640 .<SecurityZoneTopologyOperationOutput>status(true)
1641 .withResult(responseBuilder.build())
1644 return Futures.immediateFuture(rpcResult);
1647 private void trySetResponseMessage(SecurityZoneTopologyOperationOutputBuilder responseBuilder,
1648 ResponseObject error) {
1649 if (!error.getMessage().isEmpty()) {
1650 responseBuilder.setResponseMessage(error.getMessage());
1654 private void trySaveService(SecurityZoneTopologyOperationInput input, ServiceBuilder serviceBuilder) {
1655 if (isValidRequest(input) &&
1656 (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign) ||
1657 input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
1658 // Only update operational tree on activate or delete
1659 log.info(UPDATING_TREE_INFO_MESSAGE);
1660 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1664 private void trySetSvcRequestId(SecurityZoneTopologyOperationInput input,
1665 SecurityZoneTopologyOperationOutputBuilder responseBuilder) {
1666 if (input.getSdncRequestHeader() != null) {
1667 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1671 private boolean isInvalidServiceData(ServiceData sd) {
1672 return sd == null || sd.getServiceLevelOperStatus() == null;
1675 private boolean hasInvalidServiceId(SecurityZoneTopologyOperationInput input) {
1676 return input == null || input.getServiceInformation() == null
1677 || input.getServiceInformation().getServiceInstanceId() == null
1678 || input.getServiceInformation().getServiceInstanceId().length() == 0;
1681 private Future<RpcResult<SecurityZoneTopologyOperationOutput>>
1682 buildRpcResultFuture(SecurityZoneTopologyOperationOutputBuilder responseBuilder, String responseMessage) {
1684 responseBuilder.setResponseCode("404");
1685 responseBuilder.setResponseMessage(responseMessage);
1686 responseBuilder.setAckFinalIndicator("Y");
1688 RpcResult<SecurityZoneTopologyOperationOutput> rpcResult = RpcResultBuilder
1689 .<SecurityZoneTopologyOperationOutput>status(true)
1690 .withResult(responseBuilder.build())
1693 return Futures.immediateFuture(rpcResult);
1696 private boolean isValidRequest(SecurityZoneTopologyOperationInput input) {
1697 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
1701 public Future<RpcResult<TunnelxconnTopologyOperationOutput>> tunnelxconnTopologyOperation(
1702 TunnelxconnTopologyOperationInput input) {
1704 final String svcOperation = "tunnelxconn-topology-operation";
1705 Properties parms = new Properties();
1706 log.info(CALLED_STR, svcOperation);
1708 // create a new response object
1709 TunnelxconnTopologyOperationOutputBuilder responseBuilder = new TunnelxconnTopologyOperationOutputBuilder();
1710 if (hasInvalidServiceId(input)) {
1711 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
1712 responseBuilder.setResponseCode("404");
1713 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
1714 responseBuilder.setAckFinalIndicator("Y");
1716 RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
1717 .<TunnelxconnTopologyOperationOutput>status(true)
1718 .withResult(responseBuilder.build())
1721 return Futures.immediateFuture(rpcResult);
1723 String siid = input.getServiceInformation().getServiceInstanceId();
1724 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
1725 TunnelxconnTopologyOperationInputBuilder inputBuilder = new TunnelxconnTopologyOperationInputBuilder(input);
1726 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1728 // Call SLI sync method
1729 // Get SvcLogicService reference
1730 ResponseObject responseObject = new ResponseObject("200", "");
1731 String ackFinal = "Y";
1732 String allottedResourceId = ERROR_NETWORK_ID;
1733 String serviceObjectPath = null;
1734 String tunnelxconnObjectPath = null;
1735 Properties respProps = tryGetProperties(svcOperation, parms, responseObject);
1737 if (respProps != null) {
1738 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1739 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1740 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1741 allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
1742 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1743 tunnelxconnObjectPath = respProps.getProperty("tunnelxconn-object-path");
1746 if (failed(responseObject)) {
1747 responseBuilder.setResponseCode(responseObject.getStatusCode());
1748 responseBuilder.setResponseMessage(responseObject.getMessage());
1749 responseBuilder.setAckFinalIndicator(ackFinal);
1751 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1753 RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
1754 .<TunnelxconnTopologyOperationOutput>status(true)
1755 .withResult(responseBuilder.build())
1758 return Futures.immediateFuture(rpcResult);
1761 // Got success from SLI
1763 TunnelxconnResponseInformationBuilder tunnelxconnResponseInformationBuilder = new TunnelxconnResponseInformationBuilder();
1764 tunnelxconnResponseInformationBuilder.setInstanceId(allottedResourceId);
1765 tunnelxconnResponseInformationBuilder.setObjectPath(tunnelxconnObjectPath);
1766 responseBuilder.setTunnelxconnResponseInformation(tunnelxconnResponseInformationBuilder.build());
1768 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1769 serviceResponseInformationBuilder.setInstanceId(siid);
1770 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1771 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1773 } catch (IllegalStateException e) {
1774 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1775 responseBuilder.setResponseCode("500");
1776 responseBuilder.setResponseMessage(e.toString());
1777 responseBuilder.setAckFinalIndicator("Y");
1778 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1780 RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
1781 .<TunnelxconnTopologyOperationOutput>status(true)
1782 .withResult(responseBuilder.build())
1785 return Futures.immediateFuture(rpcResult);
1789 responseBuilder.setResponseCode(responseObject.getStatusCode());
1790 responseBuilder.setAckFinalIndicator(ackFinal);
1791 trySetResponseMessage(responseBuilder, responseObject);
1792 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
1793 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
1795 RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
1796 .<TunnelxconnTopologyOperationOutput>status(true)
1797 .withResult(responseBuilder.build())
1800 return Futures.immediateFuture(rpcResult);
1803 private boolean hasInvalidServiceId(ConnectionAttachmentTopologyOperationInput input) {
1804 return input == null || input.getServiceInformation() == null
1805 || input.getServiceInformation().getServiceInstanceId() == null
1806 || input.getServiceInformation().getServiceInstanceId().length() == 0;
1809 private void trySetResponseMessage(ConnectionAttachmentTopologyOperationOutputBuilder responseBuilder,
1810 ResponseObject error) {
1811 if (!error.getMessage().isEmpty()) {
1812 responseBuilder.setResponseMessage(error.getMessage());
1816 private void trySetSvcRequestId(ConnectionAttachmentTopologyOperationInput input,
1817 ConnectionAttachmentTopologyOperationOutputBuilder responseBuilder) {
1818 if (input.getSdncRequestHeader() != null) {
1819 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1823 private Future<RpcResult<ConnectionAttachmentTopologyOperationOutput>>
1824 buildRpcResultFuture(ConnectionAttachmentTopologyOperationOutputBuilder responseBuilder, String responseMessage) {
1826 responseBuilder.setResponseCode("404");
1827 responseBuilder.setResponseMessage(responseMessage);
1828 responseBuilder.setAckFinalIndicator("Y");
1830 RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
1831 .<ConnectionAttachmentTopologyOperationOutput>status(true)
1832 .withResult(responseBuilder.build())
1835 return Futures.immediateFuture(rpcResult);
1838 private void trySaveService(ConnectionAttachmentTopologyOperationInput input, ServiceBuilder serviceBuilder) {
1839 if (isValidRequest(input) &&
1840 (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign) ||
1841 input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
1842 // Only update operational tree on activate or delete
1843 log.info(UPDATING_TREE_INFO_MESSAGE);
1844 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1848 private boolean isValidRequest(ConnectionAttachmentTopologyOperationInput input) {
1849 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
1853 public Future<RpcResult<ConnectionAttachmentTopologyOperationOutput>> connectionAttachmentTopologyOperation(ConnectionAttachmentTopologyOperationInput input) {
1854 final String svcOperation = "connectionAttachment-topology-operation";
1855 Properties parms = new Properties();
1856 log.info(CALLED_STR, svcOperation);
1858 // create a new response object
1859 ConnectionAttachmentTopologyOperationOutputBuilder responseBuilder = new ConnectionAttachmentTopologyOperationOutputBuilder();
1860 if (hasInvalidServiceId(input)) {
1861 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
1862 responseBuilder.setResponseCode("404");
1863 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
1864 responseBuilder.setAckFinalIndicator("Y");
1866 RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
1867 .<ConnectionAttachmentTopologyOperationOutput>status(true)
1868 .withResult(responseBuilder.build())
1871 return Futures.immediateFuture(rpcResult);
1874 ServiceData serviceData;
1875 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1876 Properties properties = new Properties();
1878 String siid = input.getServiceInformation().getServiceInstanceId();
1879 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
1881 // Get the service-instance service data from MD-SAL
1882 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1883 getServiceData(siid, serviceDataBuilder);
1885 trySetSvcRequestId(input, responseBuilder);
1887 ServiceData sd = serviceDataBuilder.build();
1888 if (isInvalidServiceData(sd)) {
1889 log.debug(EMPTY_SERVICE_INSTANCE_MESSAGE, svcOperation);
1890 return buildRpcResultFuture(responseBuilder, INVALID_INPUT_ERROR_MESSAGE);
1893 ConnectionAttachmentTopologyOperationInputBuilder inputBuilder = new ConnectionAttachmentTopologyOperationInputBuilder(input);
1894 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1896 // Call SLI sync method
1897 // Get SvcLogicService reference
1898 ResponseObject responseObject = new ResponseObject("200", "");
1899 String ackFinal = "Y";
1900 String allottedResourceId = ERROR_NETWORK_ID;
1901 String serviceObjectPath = null;
1902 String connectionAttachmentObjectPath = null;
1904 Properties respProps = tryGetProperties(svcOperation, properties, serviceDataBuilder, responseObject);
1906 if (respProps != null) {
1907 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1908 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1909 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1910 allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
1911 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1912 connectionAttachmentObjectPath = respProps.getProperty("connectionAttachment-object-path");
1915 if (failed(responseObject)) {
1916 responseBuilder.setResponseCode(responseObject.getStatusCode());
1917 responseBuilder.setResponseMessage(responseObject.getMessage());
1918 responseBuilder.setAckFinalIndicator(ackFinal);
1920 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1922 RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
1923 .<ConnectionAttachmentTopologyOperationOutput>status(true)
1924 .withResult(responseBuilder.build())
1927 return Futures.immediateFuture(rpcResult);
1930 // Got success from SLI
1933 serviceData = serviceDataBuilder.build();
1934 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
1937 ServiceBuilder serviceBuilder = new ServiceBuilder();
1938 serviceBuilder.setServiceData(serviceData);
1939 serviceBuilder.setServiceInstanceId(siid);
1940 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1941 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1943 trySaveService(input, serviceBuilder);
1945 ConnectionAttachmentResponseInformationBuilder connectionAttachmentResponseInformationBuilder = new ConnectionAttachmentResponseInformationBuilder();
1946 connectionAttachmentResponseInformationBuilder.setInstanceId(allottedResourceId);
1947 connectionAttachmentResponseInformationBuilder.setObjectPath(connectionAttachmentObjectPath);
1948 responseBuilder.setConnectionAttachmentResponseInformation(connectionAttachmentResponseInformationBuilder.build());
1950 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1951 serviceResponseInformationBuilder.setInstanceId(siid);
1952 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1953 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1955 } catch (IllegalStateException e) {
1956 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1957 responseBuilder.setResponseCode("500");
1958 responseBuilder.setResponseMessage(e.toString());
1959 responseBuilder.setAckFinalIndicator("Y");
1960 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1962 RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
1963 .<ConnectionAttachmentTopologyOperationOutput>status(true)
1964 .withResult(responseBuilder.build())
1967 return Futures.immediateFuture(rpcResult);
1971 responseBuilder.setResponseCode(responseObject.getStatusCode());
1972 responseBuilder.setAckFinalIndicator(ackFinal);
1973 trySetResponseMessage(responseBuilder, responseObject);
1974 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
1975 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
1977 RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
1978 .<ConnectionAttachmentTopologyOperationOutput>status(true)
1979 .withResult(responseBuilder.build())
1982 return Futures.immediateFuture(rpcResult);
1985 private void trySetResponseMessage(TunnelxconnTopologyOperationOutputBuilder responseBuilder,
1986 ResponseObject error) {
1987 if (!error.getMessage().isEmpty()) {
1988 responseBuilder.setResponseMessage(error.getMessage());
1992 private boolean hasInvalidServiceId(TunnelxconnTopologyOperationInput input) {
1993 return input == null || input.getServiceInformation() == null
1994 || input.getServiceInformation().getServiceInstanceId() == null
1995 || input.getServiceInformation().getServiceInstanceId().length() == 0;
1998 private Properties tryGetProperties(String svcOperation, Properties parms, ResponseObject responseObject) {
2000 if (svcLogicClient.hasGraph(APP_NAME, svcOperation, null, "sync")) {
2003 return svcLogicClient.execute(APP_NAME, svcOperation, null, "sync", parms);
2004 } catch (Exception e) {
2005 log.error(SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE, svcOperation, e);
2006 responseObject.setMessage(e.getMessage());
2007 responseObject.setStatusCode("500");
2010 responseObject.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
2011 responseObject.setStatusCode("503");
2013 } catch (Exception e) {
2014 responseObject.setMessage(e.getMessage());
2015 responseObject.setStatusCode("500");
2016 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
2022 public Future<RpcResult<BrgTopologyOperationOutput>> brgTopologyOperation(BrgTopologyOperationInput input) {
2023 final String svcOperation = "brg-topology-operation";
2024 Properties parms = new Properties();
2026 log.info(CALLED_STR, svcOperation);
2027 // create a new response object
2028 BrgTopologyOperationOutputBuilder responseBuilder = new BrgTopologyOperationOutputBuilder();
2030 if (this.hasInvalidServiceId(input)) {
2032 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
2033 responseBuilder.setResponseCode("404");
2034 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
2035 responseBuilder.setAckFinalIndicator("Y");
2037 RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder
2038 .<BrgTopologyOperationOutput>status(true)
2039 .withResult(responseBuilder.build())
2042 return Futures.immediateFuture(rpcResult);
2045 String siid = input.getServiceInformation().getServiceInstanceId();
2047 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
2048 BrgTopologyOperationInputBuilder inputBuilder = new BrgTopologyOperationInputBuilder(input);
2049 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
2051 // Call SLI sync method
2052 // Get SvcLogicService reference
2053 ResponseObject error = new ResponseObject("200", "");
2054 String ackFinal = "Y";
2055 String allottedResourceId = ERROR_NETWORK_ID;
2056 String serviceObjectPath = null;
2057 String brgObjectPath = null;
2058 Properties respProps = tryGetProperties(svcOperation, parms, error);
2060 if (respProps != null) {
2061 error.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2062 error.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2063 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2064 allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
2065 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
2066 brgObjectPath = respProps.getProperty("brg-object-path");
2069 if (failed(error)) {
2070 responseBuilder.setResponseCode(error.getStatusCode());
2071 responseBuilder.setResponseMessage(error.getMessage());
2072 responseBuilder.setAckFinalIndicator(ackFinal);
2074 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2075 RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder
2076 .<BrgTopologyOperationOutput>status(true)
2077 .withResult(responseBuilder.build())
2080 return Futures.immediateFuture(rpcResult);
2083 // Got success from SLI
2086 BrgResponseInformationBuilder brgResponseInformationBuilder = new BrgResponseInformationBuilder();
2087 brgResponseInformationBuilder.setInstanceId(allottedResourceId);
2088 brgResponseInformationBuilder.setObjectPath(brgObjectPath);
2089 responseBuilder.setBrgResponseInformation(brgResponseInformationBuilder.build());
2091 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
2092 serviceResponseInformationBuilder.setInstanceId(siid);
2093 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
2094 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
2096 } catch (IllegalStateException e) {
2097 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
2098 responseBuilder.setResponseCode("500");
2099 responseBuilder.setResponseMessage(e.toString());
2100 responseBuilder.setAckFinalIndicator("Y");
2101 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2103 RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder
2104 .<BrgTopologyOperationOutput>status(true)
2105 .withResult(responseBuilder.build())
2108 return Futures.immediateFuture(rpcResult);
2112 responseBuilder.setResponseCode(error.getStatusCode());
2113 responseBuilder.setAckFinalIndicator(ackFinal);
2114 trySetResponseMessage(responseBuilder, error);
2115 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
2116 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
2118 RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder
2119 .<BrgTopologyOperationOutput>status(true)
2120 .withResult(responseBuilder.build())
2123 return Futures.immediateFuture(rpcResult);
2126 private void trySetResponseMessage(BrgTopologyOperationOutputBuilder responseBuilder, ResponseObject error) {
2127 if (!error.getMessage().isEmpty()) {
2128 responseBuilder.setResponseMessage(error.getMessage());
2132 private boolean hasInvalidServiceId(BrgTopologyOperationInput input) {
2133 return input == null || input.getServiceInformation() == null
2134 || input.getServiceInformation().getServiceInstanceId() == null
2135 || input.getServiceInformation().getServiceInstanceId().length() == 0;
2139 public Future<RpcResult<PreloadVnfTopologyOperationOutput>> preloadVnfTopologyOperation(
2140 PreloadVnfTopologyOperationInput input) {
2142 final String svcOperation = "preload-vnf-topology-operation";
2143 Properties parms = new Properties();
2145 log.info(CALLED_STR, svcOperation);
2146 // create a new response object
2147 PreloadVnfTopologyOperationOutputBuilder responseBuilder = new PreloadVnfTopologyOperationOutputBuilder();
2149 if (hasInvalidVnfTopology(input)) {
2151 log.debug("exiting {} because of null input", svcOperation);
2152 responseBuilder.setResponseCode("403");
2153 responseBuilder.setResponseMessage("invalid input: input is null");
2154 responseBuilder.setAckFinalIndicator("Y");
2156 RpcResult<PreloadVnfTopologyOperationOutput> rpcResult = RpcResultBuilder
2157 .<PreloadVnfTopologyOperationOutput>status(true)
2158 .withResult(responseBuilder.build())
2161 return Futures.immediateFuture(rpcResult);
2164 // Grab the name and type from the input buffer
2165 String preloadName = input.getVnfTopologyInformation().getVnfTopologyIdentifier().getVnfName();
2166 String preloadType = input.getVnfTopologyInformation().getVnfTopologyIdentifier().getVnfType();
2168 // Make sure we have a preload_name and preload_type
2169 if (invalidPreloadData(preloadName, preloadType)) {
2170 log.debug("exiting {} vnf-name or vnf-type is null or empty", svcOperation);
2171 responseBuilder.setResponseCode("403");
2172 responseBuilder.setResponseMessage("invalid input: vnf-name or vnf-type is null or empty");
2173 responseBuilder.setAckFinalIndicator("Y");
2175 RpcResult<PreloadVnfTopologyOperationOutput> rpcResult = RpcResultBuilder
2176 .<PreloadVnfTopologyOperationOutput>status(true)
2177 .withResult(responseBuilder.build())
2180 return Futures.immediateFuture(rpcResult);
2183 trySetSvcRequestId(input, responseBuilder);
2185 PreloadDataBuilder preloadDataBuilder = new PreloadDataBuilder();
2186 getPreloadData(preloadName, preloadType, preloadDataBuilder);
2188 PreloadDataBuilder operDataBuilder = new PreloadDataBuilder();
2189 getPreloadData(preloadName, preloadType, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
2191 // setup a preload-data object builder
2192 // ACTION preload-vnf-topology-operation
2194 // USES sdnc-request-header;
2195 // USES request-information;
2196 // uses vnf-topology-information;
2198 // USES vnf-topology-response-body;
2200 // container preload-data
2201 // uses vnf-topology-information;
2202 // uses network-topology-information;
2203 // uses oper-status;
2205 log.info("Adding INPUT data for {} [{},{}] input: {}", svcOperation, preloadName, preloadType, input);
2206 PreloadVnfTopologyOperationInputBuilder inputBuilder = new PreloadVnfTopologyOperationInputBuilder(input);
2207 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
2208 log.info("Adding OPERATIONAL data for {} [{},{}] operational-data: {}", svcOperation, preloadName,
2209 preloadType, operDataBuilder.build());
2210 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
2212 // Call SLI sync method
2213 // Get SvcLogicService reference
2214 ResponseObject responseObject = new ResponseObject("200", "");
2215 Properties respProps = tryGetProperties(svcOperation, parms, responseObject);
2216 String ackFinal = resolveAckFinal(responseObject, respProps);
2218 if (failed(responseObject)) {
2220 responseBuilder.setResponseCode(responseObject.getStatusCode());
2221 responseBuilder.setResponseMessage(responseObject.getMessage());
2222 responseBuilder.setAckFinalIndicator(ackFinal);
2224 VnfPreloadListBuilder preloadVnfListBuilder = new VnfPreloadListBuilder();
2225 preloadVnfListBuilder.setVnfName(preloadName);
2226 preloadVnfListBuilder.setVnfType(preloadType);
2227 preloadVnfListBuilder.setPreloadData(preloadDataBuilder.build());
2228 log.error("Returned FAILED for {} [{},{}] error code: '{}', Reason: '{}'", svcOperation, preloadName,
2229 preloadType, responseObject.getStatusCode(), responseObject.getMessage());
2231 savePreloadList(preloadVnfListBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
2232 } catch (Exception e) {
2233 log.error(UPDATING_MDSAL_ERROR_MESSAGE_2, svcOperation, preloadName,
2236 log.debug("Sending Success rpc result due to external error");
2238 RpcResult<PreloadVnfTopologyOperationOutput> rpcResult = RpcResultBuilder
2239 .<PreloadVnfTopologyOperationOutput>status(true)
2240 .withResult(responseBuilder.build())
2243 return Futures.immediateFuture(rpcResult);
2246 // Got success from SLI
2248 updatePreloadData(svcOperation, preloadName, preloadType, preloadDataBuilder);
2249 } catch (Exception e) {
2250 log.error(UPDATING_MDSAL_ERROR_MESSAGE_2, svcOperation, preloadName, preloadType,
2252 responseBuilder.setResponseCode("500");
2253 responseBuilder.setResponseMessage(e.getMessage());
2254 responseBuilder.setAckFinalIndicator("Y");
2255 log.error("Returned FAILED for {} [{},{}] {}", svcOperation, preloadName, preloadType,
2256 responseBuilder.build());
2258 RpcResult<PreloadVnfTopologyOperationOutput> rpcResult = RpcResultBuilder
2259 .<PreloadVnfTopologyOperationOutput>status(false)
2260 .withResult(responseBuilder.build())
2263 return Futures.immediateFuture(rpcResult);
2267 responseBuilder.setResponseCode(responseObject.getStatusCode());
2268 responseBuilder.setAckFinalIndicator(ackFinal);
2269 trySetResponseMessage(responseBuilder, responseObject);
2271 log.info("Updated MD-SAL for {} [{},{}]", svcOperation, preloadName, preloadType);
2272 log.info("Returned SUCCESS for {} [{},{}] {}", svcOperation, preloadName, preloadType,
2273 responseBuilder.build());
2275 RpcResult<PreloadVnfTopologyOperationOutput> rpcResult = RpcResultBuilder
2276 .<PreloadVnfTopologyOperationOutput>status(true)
2277 .withResult(responseBuilder.build())
2280 return Futures.immediateFuture(rpcResult);
2283 private String resolveAckFinal(ResponseObject responseObject, Properties respProps) {
2284 if (respProps != null) {
2285 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2286 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2287 return respProps.getProperty(ACK_FINAL_PARAM, "Y");
2292 private void trySetResponseMessage(PreloadVnfTopologyOperationOutputBuilder responseBuilder, ResponseObject error) {
2293 if (!error.getMessage().isEmpty()) {
2294 responseBuilder.setResponseMessage(error.getMessage());
2298 private void trySetSvcRequestId(PreloadVnfTopologyOperationInput input,
2299 PreloadVnfTopologyOperationOutputBuilder responseBuilder) {
2300 if (input.getSdncRequestHeader() != null) {
2301 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
2305 private boolean hasInvalidVnfTopology(PreloadVnfTopologyOperationInput input) {
2306 return input == null || input.getVnfTopologyInformation() == null
2307 || input.getVnfTopologyInformation().getVnfTopologyIdentifier() == null;
2310 private void updatePreloadData(String svcOperation, String preloadName, String preloadType,
2311 PreloadDataBuilder preloadDataBuilder) {
2312 PreloadData preloadData;
2313 preloadData = preloadDataBuilder.build();
2314 log.info("Updating MD-SAL for {} [{},{}] preloadData: {}", svcOperation, preloadName, preloadType,
2316 // svc-configuration-list
2317 VnfPreloadListBuilder preloadVnfListBuilder = new VnfPreloadListBuilder();
2318 preloadVnfListBuilder.setVnfName(preloadName);
2319 preloadVnfListBuilder.setVnfType(preloadType);
2320 preloadVnfListBuilder.setPreloadData(preloadData);
2322 // merge flag sets to false to allow it to be overwritten (not appended)
2323 savePreloadList(preloadVnfListBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
2324 log.info(UPDATING_TREE_INFO_MESSAGE);
2325 savePreloadList(preloadVnfListBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
2329 public Future<RpcResult<PreloadNetworkTopologyOperationOutput>> preloadNetworkTopologyOperation(
2330 PreloadNetworkTopologyOperationInput input) {
2332 final String svcOperation = "preload-network-topology-operation";
2333 Properties parms = new Properties();
2335 log.info(CALLED_STR, svcOperation);
2336 // create a new response object
2337 PreloadNetworkTopologyOperationOutputBuilder responseBuilder = new PreloadNetworkTopologyOperationOutputBuilder();
2339 if (hasInvalidNetworkTopology(input)) {
2341 log.debug("exiting {} because of null input", svcOperation);
2342 responseBuilder.setResponseCode("403");
2343 responseBuilder.setResponseMessage("input is null");
2344 responseBuilder.setAckFinalIndicator("Y");
2346 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2347 .<PreloadNetworkTopologyOperationOutput>status(true)
2348 .withResult(responseBuilder.build())
2351 return Futures.immediateFuture(rpcResult);
2354 // Grab the name and type from the input buffer
2355 String preloadName = input.getNetworkTopologyInformation().getNetworkTopologyIdentifier().getNetworkName();
2356 String preloadType = input.getNetworkTopologyInformation().getNetworkTopologyIdentifier().getNetworkType();
2358 // Make sure we have a preload_name and preload_type
2359 if (invalidPreloadData(preloadName, preloadType)) {
2360 log.debug("exiting {} because of invalid preload-name or preload-type", svcOperation);
2361 responseBuilder.setResponseCode("403");
2362 responseBuilder.setResponseMessage("invalid input: network-name or network-type is null or empty");
2363 responseBuilder.setAckFinalIndicator("Y");
2365 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2366 .<PreloadNetworkTopologyOperationOutput>status(true)
2367 .withResult(responseBuilder.build())
2370 return Futures.immediateFuture(rpcResult);
2373 trySetSvcRequestId(input, responseBuilder);
2375 PreloadDataBuilder preloadDataBuilder = new PreloadDataBuilder();
2376 getPreloadData(preloadName, preloadType, preloadDataBuilder);
2378 PreloadDataBuilder operDataBuilder = new PreloadDataBuilder();
2379 getPreloadData(preloadName, preloadType, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
2382 // setup a preload-data object builder
2383 // ACTION preload-network-topology-operation
2385 // USES sdnc-request-header;
2386 // USES request-information;
2387 // uses network-topology-information;
2389 // USES vnf-topology-response-body;
2391 // container preload-data
2392 // uses vnf-topology-information;
2393 // uses network-topology-information;
2394 // uses oper-status;
2396 log.info("Adding INPUT data for {} [{},{}] input: {}", svcOperation, preloadName, preloadType, input);
2397 PreloadNetworkTopologyOperationInputBuilder inputBuilder = new PreloadNetworkTopologyOperationInputBuilder(
2399 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
2400 log.info("Adding OPERATIONAL data for {} [{},{}] operational-data: {}", svcOperation, preloadName,
2401 preloadType, operDataBuilder.build());
2402 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
2404 // Call SLI sync method
2405 // Get SvcLogicService reference
2406 ResponseObject responseObject = new ResponseObject("200", "");
2407 Properties respProps = tryGetProperties(svcOperation, parms, responseObject);
2409 String ackFinal = resolveAckFinal(responseObject, respProps);
2411 if (failed(responseObject)) {
2413 responseBuilder.setResponseCode(responseObject.getStatusCode());
2414 responseBuilder.setResponseMessage(responseObject.getMessage());
2415 responseBuilder.setAckFinalIndicator(ackFinal);
2417 VnfPreloadListBuilder preloadVnfListBuilder = new VnfPreloadListBuilder();
2418 preloadVnfListBuilder.setVnfName(preloadName);
2419 preloadVnfListBuilder.setVnfType(preloadType);
2420 preloadVnfListBuilder.setPreloadData(preloadDataBuilder.build());
2421 log.error("Returned FAILED for {} [{},{}] error code: '{}', Reason: '{}'", svcOperation, preloadName,
2422 preloadType, responseObject.getStatusCode(), responseObject.getMessage());
2424 savePreloadList(preloadVnfListBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
2425 } catch (Exception e) {
2426 log.error(UPDATING_MDSAL_ERROR_MESSAGE_2, svcOperation, preloadName,
2430 log.debug("Sending Success rpc result due to external error");
2432 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2433 .<PreloadNetworkTopologyOperationOutput>status(true)
2434 .withResult(responseBuilder.build())
2437 return Futures.immediateFuture(rpcResult);
2440 // Got success from SLI
2442 updatePreloadData(svcOperation, preloadName, preloadType, preloadDataBuilder);
2443 } catch (Exception e) {
2444 log.error(UPDATING_MDSAL_ERROR_MESSAGE_2, svcOperation, preloadName, preloadType, e);
2445 responseBuilder.setResponseCode("500");
2446 responseBuilder.setResponseMessage(e.getMessage());
2447 responseBuilder.setAckFinalIndicator("Y");
2448 log.error("Returned FAILED for {} [{},{}] {}", svcOperation, preloadName, preloadType,
2449 responseBuilder.build());
2451 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2452 .<PreloadNetworkTopologyOperationOutput>status(false)
2453 .withResult(responseBuilder.build())
2456 return Futures.immediateFuture(rpcResult);
2460 responseBuilder.setResponseCode(responseObject.getStatusCode());
2461 responseBuilder.setAckFinalIndicator(ackFinal);
2462 trySetResponseMessage(responseBuilder, responseObject);
2464 log.info("Updated MD-SAL for {} [{},{}]", svcOperation, preloadName, preloadType);
2465 log.info("Returned SUCCESS for {} [{},{}] {}", svcOperation, preloadName, preloadType,
2466 responseBuilder.build());
2468 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2469 .<PreloadNetworkTopologyOperationOutput>status(true)
2470 .withResult(responseBuilder.build())
2473 return Futures.immediateFuture(rpcResult);
2476 private void trySetResponseMessage(PreloadNetworkTopologyOperationOutputBuilder responseBuilder,
2477 ResponseObject error) {
2478 if (!error.getMessage().isEmpty()) {
2479 responseBuilder.setResponseMessage(error.getMessage());
2483 private void trySetSvcRequestId(PreloadNetworkTopologyOperationInput input,
2484 PreloadNetworkTopologyOperationOutputBuilder responseBuilder) {
2485 if (input.getSdncRequestHeader() != null) {
2486 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
2490 private boolean invalidPreloadData(String preloadName, String preloadType) {
2491 return preloadName == null || preloadName.length() == 0 || preloadType == null || preloadType.length() == 0;
2494 private boolean hasInvalidNetworkTopology(PreloadNetworkTopologyOperationInput input) {
2495 return input == null || input.getNetworkTopologyInformation() == null
2496 || input.getNetworkTopologyInformation().getNetworkTopologyIdentifier() == null;