1 package org.onap.sdnc.northbound;
3 import java.text.DateFormat;
4 import java.text.SimpleDateFormat;
6 import java.util.Properties;
7 import java.util.TimeZone;
8 import java.util.concurrent.ExecutionException;
9 import java.util.concurrent.ExecutorService;
10 import java.util.concurrent.Executors;
11 import java.util.concurrent.Future;
13 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
14 import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
15 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
16 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
17 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
18 import org.opendaylight.controller.md.sal.common.api.data.OptimisticLockFailedException;
19 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
20 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
21 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
22 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.BrgTopologyOperationInput;
23 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.BrgTopologyOperationInputBuilder;
24 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.BrgTopologyOperationOutput;
25 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.BrgTopologyOperationOutputBuilder;
26 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationInput;
27 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationInputBuilder;
28 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationOutput;
29 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationOutputBuilder;
30 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.GENERICRESOURCEAPIService;
31 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.NetworkTopologyOperationInput;
32 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.NetworkTopologyOperationInputBuilder;
33 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.NetworkTopologyOperationOutput;
34 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.NetworkTopologyOperationOutputBuilder;
35 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadNetworkTopologyOperationInput;
36 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadNetworkTopologyOperationInputBuilder;
37 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadNetworkTopologyOperationOutput;
38 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadNetworkTopologyOperationOutputBuilder;
39 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadVnfTopologyOperationInput;
40 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadVnfTopologyOperationInputBuilder;
41 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadVnfTopologyOperationOutput;
42 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadVnfTopologyOperationOutputBuilder;
43 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadVnfs;
44 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadVnfsBuilder;
45 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.SecurityZoneTopologyOperationInput;
46 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.SecurityZoneTopologyOperationInputBuilder;
47 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.SecurityZoneTopologyOperationOutput;
48 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.SecurityZoneTopologyOperationOutputBuilder;
49 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServiceTopologyOperationInput;
50 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServiceTopologyOperationInputBuilder;
51 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServiceTopologyOperationOutput;
52 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServiceTopologyOperationOutputBuilder;
53 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.Services;
54 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServicesBuilder;
55 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.TunnelxconnTopologyOperationInput;
56 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.TunnelxconnTopologyOperationInputBuilder;
57 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.TunnelxconnTopologyOperationOutput;
58 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.TunnelxconnTopologyOperationOutputBuilder;
59 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VfModuleTopologyOperationInput;
60 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VfModuleTopologyOperationInputBuilder;
61 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VfModuleTopologyOperationOutput;
62 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VfModuleTopologyOperationOutputBuilder;
63 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfTopologyOperationInput;
64 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfTopologyOperationInputBuilder;
65 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfTopologyOperationOutput;
66 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfTopologyOperationOutputBuilder;
67 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.brg.response.information.BrgResponseInformationBuilder;
68 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.contrail.route.response.information.ContrailRouteResponseInformationBuilder;
69 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.network.response.information.NetworkResponseInformationBuilder;
70 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.data.PreloadData;
71 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.data.PreloadDataBuilder;
72 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.model.information.VnfPreloadList;
73 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.model.information.VnfPreloadListBuilder;
74 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.model.information.VnfPreloadListKey;
75 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.request.information.RequestInformation;
76 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.sdnc.request.header.SdncRequestHeader;
77 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.sdnc.request.header.SdncRequestHeader.SvcAction;
78 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.security.zone.response.information.SecurityZoneResponseInformationBuilder;
79 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.data.ServiceData;
80 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.data.ServiceDataBuilder;
81 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.model.infrastructure.Service;
82 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.model.infrastructure.ServiceBuilder;
83 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.model.infrastructure.ServiceKey;
84 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.response.information.ServiceResponseInformationBuilder;
85 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.status.ServiceStatus.RequestStatus;
86 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.status.ServiceStatus.RpcAction;
87 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.status.ServiceStatusBuilder;
88 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.tunnelxconn.response.information.TunnelxconnResponseInformationBuilder;
89 import org.opendaylight.yangtools.yang.binding.DataObject;
90 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
91 import org.opendaylight.yangtools.yang.common.RpcResult;
92 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
93 import org.slf4j.Logger;
94 import org.slf4j.LoggerFactory;
96 import com.google.common.base.Optional;
97 import com.google.common.util.concurrent.CheckedFuture;
98 import com.google.common.util.concurrent.Futures;
99 import com.google.common.util.concurrent.SettableFuture;
102 * Defines a base implementation for your provider. This class extends from a
103 * helper class which provides storage for the most commonly used components of
104 * the MD-SAL. Additionally the base class provides some basic logging and
105 * initialization / clean up methods.
107 * To use this, copy and paste (overwrite) the following method into the
108 * TestApplicationProviderModule class which is auto generated under
109 * 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 private 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_LOG = "exiting {} because of null or empty service-instance-id";
143 private 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 private 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 RETURNED_FAILED_MESSAGE = "Returned FAILED for {} [{}] {}";
155 private static final String UPDATING_MDSAL_INFO_MESSAGE = "Updating MD-SAL for {} [{}] ServiceData: {}";
156 private static final String UPDATED_MDSAL_INFO_MESSAGE = "Updated MD-SAL for {} [{}]";
157 private static final String RETURNED_SUCCESS_MESSAGE = "Returned SUCCESS for {} [{}] {}";
158 private static final String NON_NULL_PARAM = "non-null";
159 private static final String NULL_PARAM = "null";
160 private static final String SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE = "Caught exception executing service logic for {} ";
162 private final Logger log = LoggerFactory.getLogger(GenericResourceApiProvider.class);
163 private final ExecutorService executor;
164 private final GenericResourceApiSvcLogicServiceClient svcLogicClient;
166 protected DataBroker dataBroker;
167 protected NotificationPublishService notificationService;
168 protected RpcProviderRegistry rpcRegistry;
169 protected BindingAwareBroker.RpcRegistration<GENERICRESOURCEAPIService> rpcRegistration;
171 public GenericResourceApiProvider(
172 DataBroker dataBroker,
173 NotificationPublishService notificationPublishService,
174 RpcProviderRegistry rpcProviderRegistry,
175 GenericResourceApiSvcLogicServiceClient client
177 log.info("Creating provider for {}", APP_NAME);
178 executor = Executors.newFixedThreadPool(1);
179 setDataBroker(dataBroker);
180 setNotificationService(notificationPublishService);
181 setRpcRegistry(rpcProviderRegistry);
182 svcLogicClient = client;
187 public void initialize() {
188 log.info("Initializing provider for {}", APP_NAME);
189 // Create the top level containers
192 GenericResourceApiUtil.loadProperties();
193 } catch (Exception e) {
194 log.error("Caught Exception while trying to load properties file", e);
197 log.info("Initialization complete for {}", APP_NAME);
200 protected void initializeChild() {
201 // Override if you have custom initialization intelligence
205 public void close() throws Exception {
206 log.info("Closing provider for {}", APP_NAME);
208 rpcRegistration.close();
209 log.info("Successfully closed provider for {}", APP_NAME);
212 private static class Iso8601Util {
214 private static TimeZone timeZone = TimeZone.getTimeZone("UTC");
215 private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
217 private Iso8601Util() {}
220 dateFormat.setTimeZone(timeZone);
222 private static String now() {
223 return dateFormat.format(new Date());
227 public void setDataBroker(DataBroker dataBroker) {
228 this.dataBroker = dataBroker;
229 if (log.isDebugEnabled()) {
230 log.debug("DataBroker set to {}", dataBroker == null ? NULL_PARAM : NON_NULL_PARAM);
234 public void setNotificationService(NotificationPublishService notificationService) {
235 this.notificationService = notificationService;
236 if (log.isDebugEnabled()) {
237 log.debug("Notification Service set to {}", notificationService == null ? NULL_PARAM : NON_NULL_PARAM);
241 public void setRpcRegistry(RpcProviderRegistry rpcRegistry) {
242 this.rpcRegistry = rpcRegistry;
243 if (log.isDebugEnabled()) {
244 log.debug("RpcRegistry set to {}", rpcRegistry == null ? NULL_PARAM : NON_NULL_PARAM);
248 private void createContainers() {
250 final WriteTransaction t = dataBroker.newReadWriteTransaction();
252 // Create the service-instance container
253 t.merge(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Services.class),
254 new ServicesBuilder().build());
255 t.merge(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Services.class),
256 new ServicesBuilder().build());
258 // Create the PreloadVnfs container
259 t.merge(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(PreloadVnfs.class),
260 new PreloadVnfsBuilder().build());
261 t.merge(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(PreloadVnfs.class),
262 new PreloadVnfsBuilder().build());
265 CheckedFuture<Void, TransactionCommitFailedException> checkedFuture = t.submit();
267 log.info("Create containers succeeded!");
269 } catch (InterruptedException | ExecutionException e) {
270 log.error("Create containers failed: ", e);
274 private void setServiceStatus(ServiceStatusBuilder serviceStatusBuilder, String errorCode, String errorMessage,
276 serviceStatusBuilder.setResponseCode(errorCode);
277 serviceStatusBuilder.setResponseMessage(errorMessage);
278 serviceStatusBuilder.setFinalIndicator(ackFinal);
279 serviceStatusBuilder.setResponseTimestamp(Iso8601Util.now());
282 private void setServiceStatus(ServiceStatusBuilder serviceStatusBuilder, RequestInformation requestInformation) {
283 if (requestInformation != null && requestInformation.getRequestAction() != null) {
284 serviceStatusBuilder.setAction(requestInformation.getRequestAction().toString());
288 private void setServiceStatus(ServiceStatusBuilder serviceStatusBuilder, SdncRequestHeader requestHeader) {
289 if (requestHeader != null && requestHeader.getSvcAction() != null) {
290 switch (requestHeader.getSvcAction()) {
292 serviceStatusBuilder.setRpcAction(RpcAction.Assign);
295 serviceStatusBuilder.setRpcAction(RpcAction.Unassign);
298 serviceStatusBuilder.setRpcAction(RpcAction.Activate);
301 serviceStatusBuilder.setRpcAction(RpcAction.Deactivate);
304 serviceStatusBuilder.setRpcAction(RpcAction.Delete);
307 log.error("Unknown SvcAction: {}", requestHeader.getSvcAction());
313 private void getServiceData(String siid, ServiceDataBuilder serviceDataBuilder) {
315 getServiceData(siid, serviceDataBuilder, LogicalDatastoreType.CONFIGURATION);
318 private void getServiceData(String siid, ServiceDataBuilder serviceDataBuilder, LogicalDatastoreType type) {
319 // See if any data exists yet for this siid, if so grab it.
320 InstanceIdentifier<Service> serviceInstanceIdentifier = InstanceIdentifier
321 .builder(Services.class)
322 .child(Service.class, new ServiceKey(siid))
325 ReadOnlyTransaction readTx = dataBroker.newReadOnlyTransaction();
326 Optional<Service> data = Optional.absent();
328 data = readTx.read(type, serviceInstanceIdentifier).get();
329 } catch (InterruptedException | ExecutionException e) {
330 log.error("Caught Exception reading MD-SAL ({}) data for [{}] ", type, siid, e);
333 if (data != null && data.isPresent()) {
334 ServiceData serviceData = data.get().getServiceData();
335 if (serviceData != null) {
336 log.info("Read MD-SAL ({}) data for [{}] ServiceData: {}", type, siid, serviceData);
337 serviceDataBuilder.setSdncRequestHeader(serviceData.getSdncRequestHeader());
338 serviceDataBuilder.setRequestInformation(serviceData.getRequestInformation());
339 serviceDataBuilder.setServiceInformation(serviceData.getServiceInformation());
340 serviceDataBuilder.setServiceRequestInput(serviceData.getServiceRequestInput());
341 serviceDataBuilder.setServiceTopology(serviceData.getServiceTopology());
342 serviceDataBuilder.setServiceLevelOperStatus(serviceData.getServiceLevelOperStatus());
343 serviceDataBuilder.setNetworks(serviceData.getNetworks());
344 serviceDataBuilder.setVnfs(serviceData.getVnfs());
345 serviceDataBuilder.setProvidedAllottedResources(serviceData.getProvidedAllottedResources());
346 serviceDataBuilder.setConsumedAllottedResources(serviceData.getConsumedAllottedResources());
347 // service-instance-id needs to be set
349 log.info("No service-data found in MD-SAL ({}) for [{}]", type, siid);
352 log.info("No data found in MD-SAL ({}) for [{}]", type, siid);
356 private void getPreloadData(String vnfName, String vnfType, PreloadDataBuilder preloadDataBuilder) {
358 getPreloadData(vnfName, vnfType, preloadDataBuilder, LogicalDatastoreType.CONFIGURATION);
361 private void getPreloadData(String preloadName, String preloadType, PreloadDataBuilder preloadDataBuilder,
362 LogicalDatastoreType type) {
363 // See if any data exists yet for this name/type, if so grab it.
364 InstanceIdentifier<VnfPreloadList> preloadInstanceIdentifier = InstanceIdentifier
365 .builder(PreloadVnfs.class)
366 .child(VnfPreloadList.class, new VnfPreloadListKey(preloadName, preloadType))
369 ReadOnlyTransaction readTx = dataBroker.newReadOnlyTransaction();
370 Optional<VnfPreloadList> data = Optional.absent();
372 data = readTx.read(type, preloadInstanceIdentifier).get();
373 } catch (InterruptedException | ExecutionException e) {
374 log.error("Caught Exception reading MD-SAL ({}) for [{},{}] ", type, preloadName, preloadType, e);
377 if (data != null && data.isPresent()) {
378 PreloadData preloadData = data.get().getPreloadData();
379 if (preloadData != null) {
380 log.info("Read MD-SAL ({}) data for [{},{}] PreloadData: {}", type, preloadName, preloadType,
382 preloadDataBuilder.setVnfTopologyInformation(preloadData.getVnfTopologyInformation());
383 preloadDataBuilder.setNetworkTopologyInformation(preloadData.getNetworkTopologyInformation());
384 preloadDataBuilder.setOperStatus(preloadData.getOperStatus());
386 log.info("No preload-data found in MD-SAL ({}) for [{},{}] ", type, preloadName, preloadType);
389 log.info("No data found in MD-SAL ({}) for [{},{}] ", type, preloadName, preloadType);
393 private void saveService(final Service entry, boolean merge, LogicalDatastoreType storeType) {
394 // Each entry will be identifiable by a unique key, we have to create that
396 InstanceIdentifier<Service> path = InstanceIdentifier
397 .builder(Services.class)
398 .child(Service.class, entry.getKey())
401 trySaveEntry(entry, merge, storeType, path);
404 private void savePreloadList(final VnfPreloadList entry, boolean merge, LogicalDatastoreType storeType) {
406 // Each entry will be identifiable by a unique key, we have to create that
408 InstanceIdentifier<VnfPreloadList> path = InstanceIdentifier
409 .builder(PreloadVnfs.class)
410 .child(VnfPreloadList.class, entry.getKey())
413 trySaveEntry(entry, merge, storeType, path);
416 private <T extends DataObject> void trySaveEntry(T entry, boolean merge, LogicalDatastoreType storeType,
417 InstanceIdentifier<T> path) {
421 save(entry, merge, storeType, path);
423 } catch (OptimisticLockFailedException e) {
425 log.debug("Got OptimisticLockFailedException on last try - failing ");
426 throw new IllegalStateException(e);
428 log.debug("Got OptimisticLockFailedException - trying again ");
430 catch (TransactionCommitFailedException ex){
431 log.debug("Update DataStore failed");
432 throw new IllegalStateException(ex);
437 private <T extends DataObject> void save(T entry, boolean merge, LogicalDatastoreType storeType,
438 InstanceIdentifier<T> path)
439 throws TransactionCommitFailedException {
440 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
442 tx.merge(storeType, path, entry);
444 tx.put(storeType, path, entry);
446 tx.submit().checkedGet();
447 log.debug("Update DataStore succeeded");
450 private void deleteService(final Service entry, LogicalDatastoreType storeType) {
451 // Each entry will be identifiable by a unique key, we have to create
453 InstanceIdentifier<Service> path = InstanceIdentifier
454 .builder(Services.class)
455 .child(Service.class, entry.getKey())
458 tryDeleteEntry(storeType, path);
461 private void tryDeleteEntry(LogicalDatastoreType storeType, InstanceIdentifier<Service> path) {
465 delete(storeType, path);
467 } catch (OptimisticLockFailedException e) {
469 log.debug("Got OptimisticLockFailedException on last try - failing ");
470 throw new IllegalStateException(e);
472 log.debug("Got OptimisticLockFailedException - trying again ");
474 catch (TransactionCommitFailedException ex){
475 log.debug("Update DataStore failed");
476 throw new IllegalStateException(ex);
481 private void delete(LogicalDatastoreType storeType, InstanceIdentifier<Service> path)
482 throws TransactionCommitFailedException {
483 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
484 tx.delete(storeType, path);
485 tx.submit().checkedGet();
486 log.debug("DataStore delete succeeded");
490 public Future<RpcResult<ServiceTopologyOperationOutput>> serviceTopologyOperation(
491 ServiceTopologyOperationInput input) {
493 final String svcOperation = "service-topology-operation";
494 ServiceData serviceData;
495 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
496 Properties parms = new Properties();
498 log.info(CALLED_STR, svcOperation);
499 // create a new response object
500 ServiceTopologyOperationOutputBuilder responseBuilder = new ServiceTopologyOperationOutputBuilder();
502 if (input == null || input.getServiceInformation() == null
503 || input.getServiceInformation().getServiceInstanceId() == null
504 || input.getServiceInformation().getServiceInstanceId().length() == 0) {
505 log.debug(NULL_OR_EMPTY_ERROR_LOG, svcOperation);
506 responseBuilder.setResponseCode("404");
507 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
508 responseBuilder.setAckFinalIndicator("Y");
509 RpcResult<ServiceTopologyOperationOutput> rpcResult = RpcResultBuilder
510 .<ServiceTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
511 return Futures.immediateFuture(rpcResult);
514 // Grab the service instance ID from the input buffer
515 String siid = input.getServiceInformation().getServiceInstanceId();
517 if (input.getSdncRequestHeader() != null) {
518 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
521 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
522 getServiceData(siid, serviceDataBuilder);
524 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
525 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
527 // Set the serviceStatus based on input
528 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
529 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
532 * // setup a service-data object builder // ACTION service-topology-operation
533 * // INPUT: // USES uses service-operation-information // OUTPUT: // uses
534 * topology-response-common; // uses service-response-information;
537 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
538 ServiceTopologyOperationInputBuilder inputBuilder = new ServiceTopologyOperationInputBuilder(input);
539 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
541 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid,
542 operDataBuilder.build());
543 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
545 // Call SLI sync method
546 // Get SvcLogicService reference
548 ErrorObject error = new ErrorObject("200", "");
549 Properties respProps = null;
550 String ackFinal = "Y";
551 String serviceObjectPath = null;
554 if (svcLogicClient.hasGraph(APP_NAME, svcOperation, null, "sync")) {
556 respProps = svcLogicClient.execute(APP_NAME, svcOperation, null, "sync", serviceDataBuilder, parms);
557 } catch (Exception e) {
558 log.error(SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE, svcOperation, e);
559 error.setMessage(e.getMessage());
560 error.setStatusCode("500");
563 error.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
564 error.setStatusCode("503");
566 } catch (Exception e) {
567 error.setMessage(e.getMessage());
568 error.setStatusCode("500");
569 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
572 if (respProps != null) {
573 error.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
574 error.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
575 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
576 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
579 setServiceStatus(serviceStatusBuilder, error.getStatusCode(), error.getMessage(), ackFinal);
580 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
581 serviceStatusBuilder.setRpcName(svcOperation);
583 if (validateErrorObject(error)) {
584 responseBuilder.setResponseCode(error.getStatusCode());
585 responseBuilder.setResponseMessage(error.getMessage());
586 responseBuilder.setAckFinalIndicator(ackFinal);
588 ServiceBuilder serviceBuilder = new ServiceBuilder();
589 serviceBuilder.setServiceInstanceId(siid);
590 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
592 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
593 } catch (Exception e) {
594 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
596 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
597 RpcResult<ServiceTopologyOperationOutput> rpcResult = RpcResultBuilder
598 .<ServiceTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
599 return Futures.immediateFuture(rpcResult);
602 // Got success from SLI
604 serviceData = serviceDataBuilder.build();
605 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
608 ServiceBuilder serviceBuilder = new ServiceBuilder();
609 serviceBuilder.setServiceData(serviceData);
610 serviceBuilder.setServiceInstanceId(siid);
611 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
612 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
614 if (validateInput(input)) {
615 // Only update operational tree on delete
616 log.info("Delete from both CONFIGURATION and OPERATIONAL tree.");
617 deleteService(serviceBuilder.build(), LogicalDatastoreType.OPERATIONAL);
618 deleteService(serviceBuilder.build(), LogicalDatastoreType.CONFIGURATION);
621 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
622 serviceResponseInformationBuilder.setInstanceId(siid);
623 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
624 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
626 } catch (Exception e) {
627 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
628 responseBuilder.setResponseCode("500");
629 responseBuilder.setResponseMessage(e.toString());
630 responseBuilder.setAckFinalIndicator("Y");
631 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
632 RpcResult<ServiceTopologyOperationOutput> rpcResult = RpcResultBuilder
633 .<ServiceTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
634 return Futures.immediateFuture(rpcResult);
638 responseBuilder.setResponseCode(error.getStatusCode());
639 responseBuilder.setAckFinalIndicator(ackFinal);
640 if (!error.getMessage().isEmpty()) {
641 responseBuilder.setResponseMessage(error.getMessage());
643 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
644 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
646 RpcResult<ServiceTopologyOperationOutput> rpcResult = RpcResultBuilder
647 .<ServiceTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
648 return Futures.immediateFuture(rpcResult);
651 private boolean validateErrorObject(ErrorObject error) {
653 !error.getStatusCode().isEmpty() && !("0".equals(error.getStatusCode()) || "200".equals(error.getStatusCode()));
656 private boolean validateInput(ServiceTopologyOperationInput input) {
657 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null
658 && input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete);
662 public Future<RpcResult<VnfTopologyOperationOutput>> vnfTopologyOperation(VnfTopologyOperationInput input) {
664 final String SVC_OPERATION = "vnf-topology-operation";
665 ServiceData serviceData;
666 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
667 Properties parms = new Properties();
669 log.info(CALLED_STR, SVC_OPERATION);
670 // create a new response object
671 VnfTopologyOperationOutputBuilder responseBuilder = new VnfTopologyOperationOutputBuilder();
673 if (input == null || input.getServiceInformation() == null
674 || input.getServiceInformation().getServiceInstanceId() == null
675 || input.getServiceInformation().getServiceInstanceId().length() == 0) {
676 log.debug(NULL_OR_EMPTY_ERROR_LOG, SVC_OPERATION);
677 responseBuilder.setResponseCode("404");
678 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
679 responseBuilder.setAckFinalIndicator("Y");
680 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<VnfTopologyOperationOutput>status(true)
681 .withResult(responseBuilder.build()).build();
683 return Futures.immediateFuture(rpcResult);
686 // Grab the service instance ID from the input buffer
687 String siid = input.getServiceInformation().getServiceInstanceId();
689 if (input.getSdncRequestHeader() != null) {
690 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
693 if (input.getVnfInformation() == null || input.getVnfInformation().getVnfId() == null
694 || input.getVnfInformation().getVnfId().length() == 0) {
695 log.debug("exiting {} because of null or empty vnf-id", SVC_OPERATION);
696 responseBuilder.setResponseCode("404");
697 responseBuilder.setResponseMessage("invalid input, null or empty vnf-id");
698 responseBuilder.setAckFinalIndicator("Y");
699 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<VnfTopologyOperationOutput>status(true)
700 .withResult(responseBuilder.build()).build();
701 return Futures.immediateFuture(rpcResult);
705 * Mobility wont use vipr intf in 1707
707 * String preload_name = null; String preload_type = null; if
708 * (input.getVnfRequestInput() != null &&
709 * input.getVnfRequestInput().getVnfName() != null &&
710 * input.getVnfRequestInput().getVnfName().length() != 0) { preload_name =
711 * input.getVnfRequestInput().getVnfName(); } if
712 * (input.getVnfInformation().getVnfType() != null &&
713 * input.getVnfInformation().getVnfType().length() != 0) { preload_type =
714 * input.getVnfInformation().getVnfType(); }
716 * PreloadDataBuilder preloadDataBuilder = new PreloadDataBuilder(); if
717 * (preload_name != null && preload_type != null) { getPreloadData(preload_name,
718 * preload_type, preloadDataBuilder); } else {
719 * log.info("vnf-name and vnf-type not present in the request"); }
722 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
723 getServiceData(siid, serviceDataBuilder);
725 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
726 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
728 // Set the serviceStatus based on input
729 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
730 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
733 // setup a service-data object builder
734 // ACTION vnf-topology-operation
736 // USES sdnc-request-header;
737 // USES request-information;
738 // USES service-information;
739 // USES vnf-request-information
741 // USES vnf-topology-response-body;
742 // USES vnf-information
743 // USES service-information
745 // container service-data
746 // uses vnf-configuration-information;
749 log.info(ADDING_INPUT_DATA_LOG, SVC_OPERATION, siid, input);
750 VnfTopologyOperationInputBuilder inputBuilder = new VnfTopologyOperationInputBuilder(input);
751 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
753 log.info(ADDING_OPERATIONAL_DATA_LOG, SVC_OPERATION, siid,
754 operDataBuilder.build());
755 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
758 * log.info("Adding CONFIG data for "+SVC_OPERATION+" ["+preload_name+","+
759 * preload_type+"] preload-data: " + preloadDataBuilder.build());
760 * GenericResourceApiUtil.toProperties(parms, "preload-data",
761 * preloadDataBuilder);
764 // Call SLI sync method
765 // Get SvcLogicService reference
767 Properties respProps = null;
769 String errorCode = "200";
770 String errorMessage = null;
771 String ackFinal = "Y";
772 String serviceObjectPath = null;
775 if (svcLogicClient.hasGraph(APP_NAME, SVC_OPERATION, null, "sync")) {
778 respProps = svcLogicClient.execute(APP_NAME, SVC_OPERATION, null, "sync", serviceDataBuilder, parms);
779 } catch (Exception e) {
780 log.error(SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE, SVC_OPERATION, e);
781 errorMessage = e.getMessage();
785 errorMessage = NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'";
788 } catch (Exception e) {
790 errorMessage = e.getMessage();
791 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
794 if (respProps != null) {
795 errorCode = respProps.getProperty(ERROR_CODE_PARAM);
796 errorMessage = respProps.getProperty(ERROR_MESSAGE_PARAM);
797 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
798 serviceObjectPath = respProps.getProperty("vnf-object-path");
801 setServiceStatus(serviceStatusBuilder, errorCode, errorMessage, ackFinal);
802 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
803 // serviceStatusBuilder.setRpcName(RpcName.VnfTopologyOperation);
804 serviceStatusBuilder.setRpcName(SVC_OPERATION);
806 if (errorCode != null && errorCode.length() != 0 && !(errorCode.equals("0") || errorCode.equals("200"))) {
807 responseBuilder.setResponseCode(errorCode);
808 responseBuilder.setResponseMessage(errorMessage);
809 responseBuilder.setAckFinalIndicator(ackFinal);
811 ServiceBuilder serviceBuilder = new ServiceBuilder();
812 serviceBuilder.setServiceInstanceId(siid);
813 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
815 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
816 if (input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null) {
817 // Only update operational tree on activate or delete
818 if (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete)
819 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)) {
820 log.info("Updating OPERATIONAL tree.");
821 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
824 } catch (Exception e) {
825 log.error(UPDATING_MDSAL_ERROR_MESSAGE, SVC_OPERATION, siid, e);
827 log.error(RETURNED_FAILED_MESSAGE, SVC_OPERATION, siid, responseBuilder.build());
828 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<VnfTopologyOperationOutput>status(true)
829 .withResult(responseBuilder.build()).build();
831 return Futures.immediateFuture(rpcResult);
834 // Got success from SLI
836 serviceData = serviceDataBuilder.build();
837 log.info(UPDATING_MDSAL_INFO_MESSAGE, SVC_OPERATION, siid, serviceData);
840 ServiceBuilder serviceBuilder = new ServiceBuilder();
841 serviceBuilder.setServiceData(serviceData);
842 serviceBuilder.setServiceInstanceId(siid);
843 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
844 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
846 if (input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null) {
847 // Only update operational tree on Assign
848 if (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)) {
849 log.info("Updating OPERATIONAL tree.");
850 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
854 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
855 serviceResponseInformationBuilder.setInstanceId(siid);
856 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
857 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
859 } catch (Exception e) {
860 log.error(UPDATING_MDSAL_ERROR_MESSAGE, SVC_OPERATION, siid, e);
861 responseBuilder.setResponseCode("500");
862 responseBuilder.setResponseMessage(e.toString());
863 responseBuilder.setAckFinalIndicator("Y");
864 log.error(RETURNED_FAILED_MESSAGE, SVC_OPERATION, siid, responseBuilder.build());
865 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<VnfTopologyOperationOutput>status(true)
866 .withResult(responseBuilder.build()).build();
867 return Futures.immediateFuture(rpcResult);
871 responseBuilder.setResponseCode(errorCode);
872 responseBuilder.setAckFinalIndicator(ackFinal);
873 if (errorMessage != null) {
874 responseBuilder.setResponseMessage(errorMessage);
876 log.info(UPDATED_MDSAL_INFO_MESSAGE, SVC_OPERATION, siid);
877 log.info(RETURNED_SUCCESS_MESSAGE, SVC_OPERATION, siid, responseBuilder.build());
879 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<VnfTopologyOperationOutput>status(true)
880 .withResult(responseBuilder.build()).build();
882 return Futures.immediateFuture(rpcResult);
886 public Future<RpcResult<VfModuleTopologyOperationOutput>> vfModuleTopologyOperation(
887 VfModuleTopologyOperationInput input) {
889 final String SVC_OPERATION = "vf-module-topology-operation";
890 ServiceData serviceData;
891 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
892 Properties parms = new Properties();
894 log.info(CALLED_STR, SVC_OPERATION);
895 // create a new response object
896 VfModuleTopologyOperationOutputBuilder responseBuilder = new VfModuleTopologyOperationOutputBuilder();
898 if (input == null || input.getServiceInformation() == null
899 || input.getServiceInformation().getServiceInstanceId() == null
900 || input.getServiceInformation().getServiceInstanceId().length() == 0) {
901 log.debug(NULL_OR_EMPTY_ERROR_LOG, SVC_OPERATION);
902 responseBuilder.setResponseCode("403");
903 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
904 responseBuilder.setAckFinalIndicator("Y");
905 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
906 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
908 return Futures.immediateFuture(rpcResult);
911 if (input.getVnfInformation() == null || input.getVnfInformation().getVnfId() == null
912 || input.getVnfInformation().getVnfId().length() == 0) {
913 log.debug("exiting {} because of null or empty vnf-id", SVC_OPERATION);
914 responseBuilder.setResponseCode("403");
915 responseBuilder.setResponseMessage("invalid input, null or empty vnf-id");
916 responseBuilder.setAckFinalIndicator("Y");
917 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
918 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
919 return Futures.immediateFuture(rpcResult);
922 if (input.getVfModuleInformation() == null || input.getVfModuleInformation().getVfModuleId() == null
923 || input.getVfModuleInformation().getVfModuleId().length() == 0) {
924 log.debug("exiting {} because of null or empty vf-module-id", SVC_OPERATION);
925 responseBuilder.setResponseCode("403");
926 responseBuilder.setResponseMessage("invalid input, vf-module-id is null or empty");
927 responseBuilder.setAckFinalIndicator("Y");
928 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
929 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
930 return Futures.immediateFuture(rpcResult);
933 // Grab the service instance ID from the input buffer
934 String siid = input.getServiceInformation().getServiceInstanceId();
936 if (input.getSdncRequestHeader() != null) {
937 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
941 * String preload_name = null; String preload_type = null;
943 * preload_name = input.getVfModuleRequestInput().getVfModuleName();
945 * if(input.getVfModuleInformation().getVfModuleType() != null &&
946 * input.getVfModuleInformation().getVfModuleType().length() != 0) {
947 * preload_type = input.getVfModuleInformation().getVfModuleType(); }
949 * PreloadDataBuilder preloadDataBuilder = new PreloadDataBuilder(); if
950 * (preload_name != null && preload_type != null) { getPreloadData(preload_name,
951 * preload_type, preloadDataBuilder); } else {
952 * log.debug("vf-module-name and vf-module-type not present in the request."); }
955 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
956 getServiceData(siid, serviceDataBuilder);
958 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
959 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
961 // Set the serviceStatus based on input
962 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
963 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
966 // setup a service-data object builder
967 // ACTION vnf-topology-operation
969 // USES sdnc-request-header;
970 // USES request-information;
971 // USES service-information;
972 // USES vnf-request-information
974 // USES vnf-topology-response-body;
975 // USES vnf-information
976 // USES service-information
978 // container service-data
979 // uses vnf-configuration-information;
982 log.info(ADDING_INPUT_DATA_LOG, SVC_OPERATION, siid, input);
983 VfModuleTopologyOperationInputBuilder inputBuilder = new VfModuleTopologyOperationInputBuilder(input);
984 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
986 log.info(ADDING_OPERATIONAL_DATA_LOG, SVC_OPERATION, siid,
987 operDataBuilder.build());
988 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
991 * log.info("Adding CONFIG data for "+SVC_OPERATION+" ["+preload_name+","+
992 * preload_type+"] preload-data: " +preloadDataBuilder.build());
993 * GenericResourceApiUtil.toProperties(parms, "preload-data",
994 * preloadDataBuilder);
997 // Call SLI sync method
998 // Get SvcLogicService reference
1000 Properties respProps = null;
1002 String errorCode = "200";
1003 String errorMessage = null;
1004 String ackFinal = "Y";
1005 String serviceObjectPath = null;
1008 if (svcLogicClient.hasGraph(APP_NAME, SVC_OPERATION, null, "sync")) {
1011 respProps = svcLogicClient.execute(APP_NAME, SVC_OPERATION, null, "sync", serviceDataBuilder, parms);
1012 } catch (Exception e) {
1013 log.error("Caught exception executing service logic for " + SVC_OPERATION, e);
1014 errorMessage = e.getMessage();
1018 errorMessage = NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'";
1021 } catch (Exception e) {
1023 errorMessage = e.getMessage();
1024 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
1027 if (respProps != null) {
1028 errorCode = respProps.getProperty(ERROR_CODE_PARAM);
1029 errorMessage = respProps.getProperty(ERROR_MESSAGE_PARAM);
1030 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1031 serviceObjectPath = respProps.getProperty("vf-module-object-path");
1034 setServiceStatus(serviceStatusBuilder, errorCode, errorMessage, ackFinal);
1035 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
1036 serviceStatusBuilder.setRpcName(SVC_OPERATION);
1038 if (errorCode != null && errorCode.length() != 0 && !(errorCode.equals("0") || errorCode.equals("200"))) {
1039 responseBuilder.setResponseCode(errorCode);
1040 responseBuilder.setResponseMessage(errorMessage);
1041 responseBuilder.setAckFinalIndicator(ackFinal);
1043 ServiceBuilder serviceBuilder = new ServiceBuilder();
1044 serviceBuilder.setServiceInstanceId(siid);
1045 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1047 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
1048 } catch (Exception e) {
1049 log.error(UPDATING_MDSAL_ERROR_MESSAGE, SVC_OPERATION, siid, e);
1051 log.error(RETURNED_FAILED_MESSAGE, SVC_OPERATION, siid, responseBuilder.build());
1052 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1053 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1055 return Futures.immediateFuture(rpcResult);
1058 // Got success from SLI
1060 serviceData = serviceDataBuilder.build();
1061 log.info(UPDATING_MDSAL_INFO_MESSAGE, SVC_OPERATION, siid, serviceData);
1064 ServiceBuilder serviceBuilder = new ServiceBuilder();
1065 serviceBuilder.setServiceData(serviceData);
1066 // serviceBuilder.setServiceInstanceId(serviceData.getServiceTopology().getServiceTopologyIdentifier().getServiceInstanceId());
1067 serviceBuilder.setServiceInstanceId(siid);
1068 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1069 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1071 if (input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null) {
1072 // Only update operational tree on activate or delete
1073 if (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign)
1074 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)) {
1075 log.info("Updating OPERATIONAL tree.");
1076 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1080 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1081 serviceResponseInformationBuilder.setInstanceId(siid);
1082 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1083 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1085 } catch (Exception e) {
1086 log.error(UPDATING_MDSAL_ERROR_MESSAGE, SVC_OPERATION, siid, e);
1087 responseBuilder.setResponseCode("500");
1088 responseBuilder.setResponseMessage(e.toString());
1089 responseBuilder.setAckFinalIndicator("Y");
1090 log.error(RETURNED_FAILED_MESSAGE, SVC_OPERATION, siid, responseBuilder.build());
1091 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1092 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1093 return Futures.immediateFuture(rpcResult);
1097 responseBuilder.setResponseCode(errorCode);
1098 responseBuilder.setAckFinalIndicator(ackFinal);
1099 if (errorMessage != null) {
1100 responseBuilder.setResponseMessage(errorMessage);
1102 log.info(UPDATED_MDSAL_INFO_MESSAGE, SVC_OPERATION, siid);
1103 log.info(RETURNED_SUCCESS_MESSAGE, SVC_OPERATION, siid, responseBuilder.build());
1105 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1106 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1108 return Futures.immediateFuture(rpcResult);
1112 public Future<RpcResult<NetworkTopologyOperationOutput>> networkTopologyOperation(
1113 NetworkTopologyOperationInput input) {
1115 final String SVC_OPERATION = "network-topology-operation";
1116 ServiceData serviceData;
1117 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1118 Properties parms = new Properties();
1120 log.info(CALLED_STR, SVC_OPERATION);
1121 // create a new response object
1122 NetworkTopologyOperationOutputBuilder responseBuilder = new NetworkTopologyOperationOutputBuilder();
1124 if (input == null || input.getServiceInformation() == null
1125 || input.getServiceInformation().getServiceInstanceId() == null
1126 || input.getServiceInformation().getServiceInstanceId().length() == 0) {
1127 log.debug(NULL_OR_EMPTY_ERROR_LOG, SVC_OPERATION);
1128 responseBuilder.setResponseCode("404");
1129 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
1130 responseBuilder.setAckFinalIndicator("Y");
1131 RpcResult<NetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
1132 .<NetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1133 return Futures.immediateFuture(rpcResult);
1136 String siid = input.getServiceInformation().getServiceInstanceId();
1138 // Get the service-instance service data from MD-SAL
1139 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1140 getServiceData(siid, serviceDataBuilder);
1142 if (input.getSdncRequestHeader() != null) {
1143 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1146 ServiceData sd = serviceDataBuilder.build();
1147 if (sd == null || sd.getServiceLevelOperStatus() == null) {
1148 log.debug("exiting {} because the service-instance does not have any service data in SDNC", SVC_OPERATION);
1149 responseBuilder.setResponseCode("404");
1151 .setResponseMessage("invalid input: the service-instance does not have any service data in SDNC");
1152 responseBuilder.setAckFinalIndicator("Y");
1153 RpcResult<NetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
1154 .<NetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1155 return Futures.immediateFuture(rpcResult);
1159 * //String preload_name = null; //String preload_type = null; // If both
1160 * network-name and network-type are present in request, get the preload network
1161 * from MD-SAL if (input.getNetworkRequestInput() != null &&
1162 * input.getNetworkRequestInput().getNetworkName() != null &&
1163 * input.getNetworkRequestInput().getNetworkName().length() != 0) { preload_name
1164 * = input.getNetworkRequestInput().getNetworkName(); } if
1165 * (input.getNetworkInformation() != null &&
1166 * input.getNetworkInformation().getNetworkType() != null &&
1167 * input.getNetworkInformation().getNetworkType().length() != 0) { preload_type
1168 * = input.getNetworkInformation().getNetworkType(); }
1170 * PreloadDataBuilder preloadDataBuilder = new PreloadDataBuilder(); if
1171 * (preload_name != null && preload_type != null) { getPreloadData(preload_name,
1172 * preload_type, preloadDataBuilder); } else {
1173 * log.debug("network-name and network-type not present in request"); }
1176 log.info(ADDING_INPUT_DATA_LOG, SVC_OPERATION, siid, input);
1177 NetworkTopologyOperationInputBuilder inputBuilder = new NetworkTopologyOperationInputBuilder(input);
1178 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1180 // Call SLI sync method
1181 // Get SvcLogicService reference
1183 Properties respProps = null;
1185 String errorCode = "200";
1186 String errorMessage = null;
1187 String ackFinal = "Y";
1188 String networkId = "error";
1189 String serviceObjectPath = null;
1190 String networkObjectPath = null;
1193 if (svcLogicClient.hasGraph(APP_NAME, SVC_OPERATION, null, "sync")) {
1196 respProps = svcLogicClient.execute(APP_NAME, SVC_OPERATION, null, "sync", serviceDataBuilder, parms);
1197 } catch (Exception e) {
1198 log.error("Caught exception executing service logic for {}", SVC_OPERATION, e);
1199 errorMessage = e.getMessage();
1203 errorMessage = NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'";
1206 } catch (Exception e) {
1208 errorMessage = e.getMessage();
1209 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
1212 if (respProps != null) {
1213 errorCode = respProps.getProperty(ERROR_CODE_PARAM);
1214 errorMessage = respProps.getProperty(ERROR_MESSAGE_PARAM);
1215 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1216 networkId = respProps.getProperty("networkId");
1217 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1218 networkObjectPath = respProps.getProperty("network-object-path");
1221 if (errorCode != null && errorCode.length() != 0 && !(errorCode.equals("0") || errorCode.equals("200"))) {
1222 responseBuilder.setResponseCode(errorCode);
1223 responseBuilder.setResponseMessage(errorMessage);
1224 responseBuilder.setAckFinalIndicator(ackFinal);
1226 log.error(RETURNED_FAILED_MESSAGE, SVC_OPERATION, siid, responseBuilder.build());
1228 RpcResult<NetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
1229 .<NetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1230 return Futures.immediateFuture(rpcResult);
1233 // Got success from SLI
1236 serviceData = serviceDataBuilder.build();
1237 log.info(UPDATING_MDSAL_INFO_MESSAGE, SVC_OPERATION, siid, serviceData);
1240 ServiceBuilder serviceBuilder = new ServiceBuilder();
1241 serviceBuilder.setServiceData(serviceData);
1242 serviceBuilder.setServiceInstanceId(siid);
1243 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1244 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1246 if (input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null) {
1247 // Only update operational tree on Activate
1248 if (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)
1249 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Create)) {
1250 log.info("Updating OPERATIONAL tree.");
1251 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1255 NetworkResponseInformationBuilder networkResponseInformationBuilder = new NetworkResponseInformationBuilder();
1256 networkResponseInformationBuilder.setInstanceId(networkId);
1257 networkResponseInformationBuilder.setObjectPath(networkObjectPath);
1258 responseBuilder.setNetworkResponseInformation(networkResponseInformationBuilder.build());
1260 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1261 serviceResponseInformationBuilder.setInstanceId(siid);
1262 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1263 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1265 } catch (IllegalStateException e) {
1266 log.error(UPDATING_MDSAL_ERROR_MESSAGE, SVC_OPERATION, siid, e);
1267 responseBuilder.setResponseCode("500");
1268 responseBuilder.setResponseMessage(e.toString());
1269 responseBuilder.setAckFinalIndicator("Y");
1270 log.error(RETURNED_FAILED_MESSAGE, SVC_OPERATION, siid, responseBuilder.build());
1271 RpcResult<NetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
1272 .<NetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1273 return Futures.immediateFuture(rpcResult);
1277 responseBuilder.setResponseCode(errorCode);
1278 responseBuilder.setAckFinalIndicator(ackFinal);
1279 if (errorMessage != null) {
1280 responseBuilder.setResponseMessage(errorMessage);
1282 log.info(UPDATED_MDSAL_INFO_MESSAGE, SVC_OPERATION, siid);
1283 log.info(RETURNED_SUCCESS_MESSAGE, SVC_OPERATION, siid, responseBuilder.build());
1285 RpcResult<NetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
1286 .<NetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1287 return Futures.immediateFuture(rpcResult);
1291 public Future<RpcResult<ContrailRouteTopologyOperationOutput>> contrailRouteTopologyOperation(
1292 ContrailRouteTopologyOperationInput input) {
1294 final String SVC_OPERATION = "contrail-route-topology-operation";
1295 ServiceData serviceData;
1296 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1297 Properties parms = new Properties();
1299 log.info(CALLED_STR, SVC_OPERATION);
1300 // create a new response object
1301 ContrailRouteTopologyOperationOutputBuilder responseBuilder = new ContrailRouteTopologyOperationOutputBuilder();
1303 if (input == null || input.getServiceInformation() == null
1304 || input.getServiceInformation().getServiceInstanceId() == null
1305 || input.getServiceInformation().getServiceInstanceId().length() == 0) {
1306 log.debug(NULL_OR_EMPTY_ERROR_LOG, SVC_OPERATION);
1307 responseBuilder.setResponseCode("404");
1308 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
1309 responseBuilder.setAckFinalIndicator("Y");
1310 RpcResult<ContrailRouteTopologyOperationOutput> rpcResult = RpcResultBuilder
1311 .<ContrailRouteTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1312 return Futures.immediateFuture(rpcResult);
1315 String siid = input.getServiceInformation().getServiceInstanceId();
1317 // Get the service-instance service data from MD-SAL
1318 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1319 getServiceData(siid, serviceDataBuilder);
1321 if (input.getSdncRequestHeader() != null) {
1322 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1325 ServiceData sd = serviceDataBuilder.build();
1326 if (sd == null || sd.getServiceLevelOperStatus() == null) {
1327 log.debug("exiting {} because the service-instance does not have any service data in SDNC", SVC_OPERATION);
1328 responseBuilder.setResponseCode("404");
1330 .setResponseMessage("invalid input: the service-instance does not have any service data in SDNC");
1331 responseBuilder.setAckFinalIndicator("Y");
1332 RpcResult<ContrailRouteTopologyOperationOutput> rpcResult = RpcResultBuilder
1333 .<ContrailRouteTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1334 return Futures.immediateFuture(rpcResult);
1337 log.info("Adding INPUT data for " + SVC_OPERATION + " [" + siid + "] input: " + input);
1338 ContrailRouteTopologyOperationInputBuilder inputBuilder = new ContrailRouteTopologyOperationInputBuilder(input);
1339 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1341 // Call SLI sync method
1342 // Get SvcLogicService reference
1344 Properties respProps = null;
1346 String errorCode = "200";
1347 String errorMessage = null;
1348 String ackFinal = "Y";
1349 String allottedResourceId = "error";
1350 String serviceObjectPath = null;
1351 String contrailRouteObjectPath = null;
1354 if (svcLogicClient.hasGraph(APP_NAME, SVC_OPERATION, null, "sync")) {
1357 respProps = svcLogicClient.execute(APP_NAME, SVC_OPERATION, null, "sync", serviceDataBuilder, parms);
1358 } catch (Exception e) {
1359 log.error("Caught exception executing service logic for {}", SVC_OPERATION, e);
1360 errorMessage = e.getMessage();
1364 errorMessage = NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'";
1367 } catch (Exception e) {
1369 errorMessage = e.getMessage();
1370 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
1373 if (respProps != null) {
1374 errorCode = respProps.getProperty(ERROR_CODE_PARAM);
1375 errorMessage = respProps.getProperty(ERROR_MESSAGE_PARAM);
1376 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1377 allottedResourceId = respProps.getProperty("allotted-resource-id");
1378 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1379 contrailRouteObjectPath = respProps.getProperty("contrail-route-object-path");
1382 if (errorCode != null && errorCode.length() != 0 && !(errorCode.equals("0") || errorCode.equals("200"))) {
1383 responseBuilder.setResponseCode(errorCode);
1384 responseBuilder.setResponseMessage(errorMessage);
1385 responseBuilder.setAckFinalIndicator(ackFinal);
1387 log.error(RETURNED_FAILED_MESSAGE, SVC_OPERATION, siid, responseBuilder.build());
1389 RpcResult<ContrailRouteTopologyOperationOutput> rpcResult = RpcResultBuilder
1390 .<ContrailRouteTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1391 return Futures.immediateFuture(rpcResult);
1394 // Got success from SLI
1397 serviceData = serviceDataBuilder.build();
1398 log.info(UPDATING_MDSAL_INFO_MESSAGE, SVC_OPERATION, siid, serviceData);
1401 ServiceBuilder serviceBuilder = new ServiceBuilder();
1402 serviceBuilder.setServiceData(serviceData);
1403 serviceBuilder.setServiceInstanceId(siid);
1404 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1405 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1407 if (input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null) {
1408 // Only update operational tree on activate or delete
1409 if (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign)
1410 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)) {
1411 log.info("Updating OPERATIONAL tree.");
1412 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1416 ContrailRouteResponseInformationBuilder contrailRouteResponseInformationBuilder = new ContrailRouteResponseInformationBuilder();
1417 contrailRouteResponseInformationBuilder.setInstanceId(allottedResourceId);
1418 contrailRouteResponseInformationBuilder.setObjectPath(contrailRouteObjectPath);
1419 responseBuilder.setContrailRouteResponseInformation(contrailRouteResponseInformationBuilder.build());
1421 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1422 serviceResponseInformationBuilder.setInstanceId(siid);
1423 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1424 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1426 } catch (IllegalStateException e) {
1427 log.error(UPDATING_MDSAL_ERROR_MESSAGE, SVC_OPERATION, siid, e);
1428 responseBuilder.setResponseCode("500");
1429 responseBuilder.setResponseMessage(e.toString());
1430 responseBuilder.setAckFinalIndicator("Y");
1431 log.error(RETURNED_FAILED_MESSAGE, SVC_OPERATION, siid, responseBuilder.build());
1432 RpcResult<ContrailRouteTopologyOperationOutput> rpcResult = RpcResultBuilder
1433 .<ContrailRouteTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1434 return Futures.immediateFuture(rpcResult);
1438 responseBuilder.setResponseCode(errorCode);
1439 responseBuilder.setAckFinalIndicator(ackFinal);
1440 if (errorMessage != null) {
1441 responseBuilder.setResponseMessage(errorMessage);
1443 log.info(UPDATED_MDSAL_INFO_MESSAGE, SVC_OPERATION, siid);
1444 log.info(RETURNED_SUCCESS_MESSAGE, SVC_OPERATION, siid, responseBuilder.build());
1446 RpcResult<ContrailRouteTopologyOperationOutput> rpcResult = RpcResultBuilder
1447 .<ContrailRouteTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1448 return Futures.immediateFuture(rpcResult);
1452 public Future<RpcResult<SecurityZoneTopologyOperationOutput>> securityZoneTopologyOperation(
1453 SecurityZoneTopologyOperationInput input) {
1455 final String SVC_OPERATION = "security-zone-topology-operation";
1456 ServiceData serviceData;
1457 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1458 Properties parms = new Properties();
1460 log.info(CALLED_STR, SVC_OPERATION);
1461 // create a new response object
1462 SecurityZoneTopologyOperationOutputBuilder responseBuilder = new SecurityZoneTopologyOperationOutputBuilder();
1464 if (input == null || input.getServiceInformation() == null
1465 || input.getServiceInformation().getServiceInstanceId() == null
1466 || input.getServiceInformation().getServiceInstanceId().length() == 0) {
1467 log.debug(NULL_OR_EMPTY_ERROR_LOG, SVC_OPERATION);
1468 responseBuilder.setResponseCode("404");
1469 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
1470 responseBuilder.setAckFinalIndicator("Y");
1471 RpcResult<SecurityZoneTopologyOperationOutput> rpcResult = RpcResultBuilder
1472 .<SecurityZoneTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1473 return Futures.immediateFuture(rpcResult);
1476 String siid = input.getServiceInformation().getServiceInstanceId();
1478 // Get the service-instance service data from MD-SAL
1479 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1480 getServiceData(siid, serviceDataBuilder);
1482 if (input.getSdncRequestHeader() != null) {
1483 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1486 ServiceData sd = serviceDataBuilder.build();
1487 if (sd == null || sd.getServiceLevelOperStatus() == null) {
1488 log.debug("exiting {} because the service-instance does not have any service data in SDNC", SVC_OPERATION);
1489 responseBuilder.setResponseCode("404");
1491 .setResponseMessage("invalid input: the service-instance does not have any service data in SDNC");
1492 responseBuilder.setAckFinalIndicator("Y");
1493 RpcResult<SecurityZoneTopologyOperationOutput> rpcResult = RpcResultBuilder
1494 .<SecurityZoneTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1495 return Futures.immediateFuture(rpcResult);
1498 log.info(ADDING_INPUT_DATA_LOG, SVC_OPERATION, siid, input);
1499 SecurityZoneTopologyOperationInputBuilder inputBuilder = new SecurityZoneTopologyOperationInputBuilder(input);
1500 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1502 // Call SLI sync method
1503 // Get SvcLogicService reference
1505 Properties respProps = null;
1507 String errorCode = "200";
1508 String errorMessage = null;
1509 String ackFinal = "Y";
1510 String allottedResourceId = "error";
1511 String serviceObjectPath = null;
1512 String securityZoneObjectPath = null;
1515 if (svcLogicClient.hasGraph(APP_NAME, SVC_OPERATION, null, "sync")) {
1518 respProps = svcLogicClient.execute(APP_NAME, SVC_OPERATION, null, "sync", serviceDataBuilder, parms);
1519 } catch (Exception e) {
1520 log.error("Caught exception executing service logic for {}", SVC_OPERATION, e);
1521 errorMessage = e.getMessage();
1525 errorMessage = NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'";
1528 } catch (Exception e) {
1530 errorMessage = e.getMessage();
1531 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
1534 if (respProps != null) {
1535 errorCode = respProps.getProperty(ERROR_CODE_PARAM);
1536 errorMessage = respProps.getProperty(ERROR_MESSAGE_PARAM);
1537 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1538 allottedResourceId = respProps.getProperty("allotted-resource-id");
1539 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1540 securityZoneObjectPath = respProps.getProperty("security-zone-object-path");
1543 if (errorCode != null && errorCode.length() != 0 && !(errorCode.equals("0") || errorCode.equals("200"))) {
1544 responseBuilder.setResponseCode(errorCode);
1545 responseBuilder.setResponseMessage(errorMessage);
1546 responseBuilder.setAckFinalIndicator(ackFinal);
1548 log.error(RETURNED_FAILED_MESSAGE, SVC_OPERATION, siid, responseBuilder.build());
1550 RpcResult<SecurityZoneTopologyOperationOutput> rpcResult = RpcResultBuilder
1551 .<SecurityZoneTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1552 return Futures.immediateFuture(rpcResult);
1555 // Got success from SLI
1558 serviceData = serviceDataBuilder.build();
1559 log.info(UPDATING_MDSAL_INFO_MESSAGE, SVC_OPERATION, siid, serviceData);
1562 ServiceBuilder serviceBuilder = new ServiceBuilder();
1563 serviceBuilder.setServiceData(serviceData);
1564 serviceBuilder.setServiceInstanceId(siid);
1565 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1566 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1568 if (input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null) {
1569 // Only update operational tree on activate or delete
1570 if (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign)
1571 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)) {
1572 log.info("Updating OPERATIONAL tree.");
1573 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1577 SecurityZoneResponseInformationBuilder securityZoneResponseInformationBuilder = new SecurityZoneResponseInformationBuilder();
1578 securityZoneResponseInformationBuilder.setInstanceId(allottedResourceId);
1579 securityZoneResponseInformationBuilder.setObjectPath(securityZoneObjectPath);
1580 responseBuilder.setSecurityZoneResponseInformation(securityZoneResponseInformationBuilder.build());
1582 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1583 serviceResponseInformationBuilder.setInstanceId(siid);
1584 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1585 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1587 } catch (IllegalStateException e) {
1588 log.error(UPDATING_MDSAL_ERROR_MESSAGE, SVC_OPERATION, siid, e);
1589 responseBuilder.setResponseCode("500");
1590 responseBuilder.setResponseMessage(e.toString());
1591 responseBuilder.setAckFinalIndicator("Y");
1592 log.error(RETURNED_FAILED_MESSAGE, SVC_OPERATION, siid, responseBuilder.build());
1593 RpcResult<SecurityZoneTopologyOperationOutput> rpcResult = RpcResultBuilder
1594 .<SecurityZoneTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1595 return Futures.immediateFuture(rpcResult);
1599 responseBuilder.setResponseCode(errorCode);
1600 responseBuilder.setAckFinalIndicator(ackFinal);
1601 if (errorMessage != null) {
1602 responseBuilder.setResponseMessage(errorMessage);
1604 log.info(UPDATED_MDSAL_INFO_MESSAGE, SVC_OPERATION, siid);
1605 log.info(RETURNED_SUCCESS_MESSAGE, SVC_OPERATION, siid, responseBuilder.build());
1607 RpcResult<SecurityZoneTopologyOperationOutput> rpcResult = RpcResultBuilder
1608 .<SecurityZoneTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1609 return Futures.immediateFuture(rpcResult);
1613 public Future<RpcResult<TunnelxconnTopologyOperationOutput>> tunnelxconnTopologyOperation(
1614 TunnelxconnTopologyOperationInput input) {
1616 final String SVC_OPERATION = "tunnelxconn-topology-operation";
1617 ServiceData serviceData;
1618 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1619 Properties parms = new Properties();
1621 log.info(CALLED_STR, SVC_OPERATION);
1622 // create a new response object
1623 TunnelxconnTopologyOperationOutputBuilder responseBuilder = new TunnelxconnTopologyOperationOutputBuilder();
1625 if (input == null || input.getServiceInformation() == null
1626 || input.getServiceInformation().getServiceInstanceId() == null
1627 || input.getServiceInformation().getServiceInstanceId().length() == 0) {
1628 log.debug(NULL_OR_EMPTY_ERROR_LOG, SVC_OPERATION);
1629 responseBuilder.setResponseCode("404");
1630 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
1631 responseBuilder.setAckFinalIndicator("Y");
1632 RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
1633 .<TunnelxconnTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1634 return Futures.immediateFuture(rpcResult);
1637 String siid = input.getServiceInformation().getServiceInstanceId();
1639 // Get the service-instance service data from MD-SAL
1640 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1641 getServiceData(siid, serviceDataBuilder);
1643 if (input.getSdncRequestHeader() != null) {
1644 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1647 ServiceData sd = serviceDataBuilder.build();
1648 if (sd == null || sd.getServiceLevelOperStatus() == null) {
1649 log.debug("exiting {} because the service-instance does not have any service data in SDNC", SVC_OPERATION);
1650 responseBuilder.setResponseCode("404");
1652 .setResponseMessage("invalid input: the service-instance does not have any service data in SDNC");
1653 responseBuilder.setAckFinalIndicator("Y");
1654 RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
1655 .<TunnelxconnTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1656 return Futures.immediateFuture(rpcResult);
1659 log.info(ADDING_INPUT_DATA_LOG, SVC_OPERATION, siid, input);
1660 TunnelxconnTopologyOperationInputBuilder inputBuilder = new TunnelxconnTopologyOperationInputBuilder(input);
1661 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1663 // Call SLI sync method
1664 // Get SvcLogicService reference
1666 Properties respProps = null;
1668 String errorCode = "200";
1669 String errorMessage = null;
1670 String ackFinal = "Y";
1671 String allottedResourceId = "error";
1672 String serviceObjectPath = null;
1673 String tunnelxconnObjectPath = null;
1676 if (svcLogicClient.hasGraph(APP_NAME, SVC_OPERATION, null, "sync")) {
1679 respProps = svcLogicClient.execute(APP_NAME, SVC_OPERATION, null, "sync", parms);
1680 } catch (Exception e) {
1681 log.error("Caught exception executing service logic for {}", SVC_OPERATION, e);
1682 errorMessage = e.getMessage();
1686 errorMessage = NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'";
1689 } catch (Exception e) {
1691 errorMessage = e.getMessage();
1692 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
1695 if (respProps != null) {
1696 errorCode = respProps.getProperty(ERROR_CODE_PARAM);
1697 errorMessage = respProps.getProperty(ERROR_MESSAGE_PARAM);
1698 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1699 allottedResourceId = respProps.getProperty("allotted-resource-id");
1700 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1701 tunnelxconnObjectPath = respProps.getProperty("tunnelxconn-object-path");
1704 if (errorCode != null && errorCode.length() != 0 && !(errorCode.equals("0") || errorCode.equals("200"))) {
1705 responseBuilder.setResponseCode(errorCode);
1706 responseBuilder.setResponseMessage(errorMessage);
1707 responseBuilder.setAckFinalIndicator(ackFinal);
1709 log.error(RETURNED_FAILED_MESSAGE, SVC_OPERATION, siid, responseBuilder.build());
1711 RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
1712 .<TunnelxconnTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1713 return Futures.immediateFuture(rpcResult);
1716 // Got success from SLI
1721 TunnelxconnResponseInformationBuilder tunnelxconnResponseInformationBuilder = new TunnelxconnResponseInformationBuilder();
1722 tunnelxconnResponseInformationBuilder.setInstanceId(allottedResourceId);
1723 tunnelxconnResponseInformationBuilder.setObjectPath(tunnelxconnObjectPath);
1724 responseBuilder.setTunnelxconnResponseInformation(tunnelxconnResponseInformationBuilder.build());
1726 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1727 serviceResponseInformationBuilder.setInstanceId(siid);
1728 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1729 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1731 } catch (IllegalStateException e) {
1732 log.error(UPDATING_MDSAL_ERROR_MESSAGE, SVC_OPERATION, siid, e);
1733 responseBuilder.setResponseCode("500");
1734 responseBuilder.setResponseMessage(e.toString());
1735 responseBuilder.setAckFinalIndicator("Y");
1736 log.error(RETURNED_FAILED_MESSAGE, SVC_OPERATION, siid, responseBuilder.build());
1737 RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
1738 .<TunnelxconnTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1739 return Futures.immediateFuture(rpcResult);
1743 responseBuilder.setResponseCode(errorCode);
1744 responseBuilder.setAckFinalIndicator(ackFinal);
1745 if (errorMessage != null) {
1746 responseBuilder.setResponseMessage(errorMessage);
1748 log.info(UPDATED_MDSAL_INFO_MESSAGE, SVC_OPERATION, siid);
1749 log.info(RETURNED_SUCCESS_MESSAGE, SVC_OPERATION, siid, responseBuilder.build());
1751 RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
1752 .<TunnelxconnTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1753 return Futures.immediateFuture(rpcResult);
1757 public Future<RpcResult<BrgTopologyOperationOutput>> brgTopologyOperation(BrgTopologyOperationInput input) {
1758 final String SVC_OPERATION = "brg-topology-operation";
1759 ServiceData serviceData;
1760 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1761 Properties parms = new Properties();
1763 log.info(CALLED_STR, SVC_OPERATION);
1764 // create a new response object
1765 BrgTopologyOperationOutputBuilder responseBuilder = new BrgTopologyOperationOutputBuilder();
1767 if (input == null || input.getServiceInformation() == null
1768 || input.getServiceInformation().getServiceInstanceId() == null
1769 || input.getServiceInformation().getServiceInstanceId().length() == 0) {
1770 log.debug(NULL_OR_EMPTY_ERROR_LOG, SVC_OPERATION);
1771 responseBuilder.setResponseCode("404");
1772 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
1773 responseBuilder.setAckFinalIndicator("Y");
1774 RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder.<BrgTopologyOperationOutput>status(true)
1775 .withResult(responseBuilder.build()).build();
1776 return Futures.immediateFuture(rpcResult);
1779 String siid = input.getServiceInformation().getServiceInstanceId();
1781 /* // Get the service-instance service data from MD-SAL
1782 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1783 getServiceData(siid, serviceDataBuilder);
1785 if (input.getSdncRequestHeader() != null) {
1786 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1789 ServiceData sd = serviceDataBuilder.build();
1790 if (sd == null || sd.getServiceLevelOperStatus() == null) {
1791 log.debug("exiting {} because the service-instance does not have any service data in SDNC", SVC_OPERATION);
1792 responseBuilder.setResponseCode("404");
1794 .setResponseMessage("invalid input: the service-instance does not have any service data in SDNC");
1795 responseBuilder.setAckFinalIndicator("Y");
1796 RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder.<BrgTopologyOperationOutput>status(true)
1797 .withResult(responseBuilder.build()).build();
1798 return Futures.immediateFuture(rpcResult);
1801 log.info(ADDING_INPUT_DATA_LOG, SVC_OPERATION, siid, input);
1802 BrgTopologyOperationInputBuilder inputBuilder = new BrgTopologyOperationInputBuilder(input);
1803 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1805 // Call SLI sync method
1806 // Get SvcLogicService reference
1808 Properties respProps = null;
1810 String errorCode = "200";
1811 String errorMessage = null;
1812 String ackFinal = "Y";
1813 String allottedResourceId = "error";
1814 String serviceObjectPath = null;
1815 String brgObjectPath = null;
1818 if (svcLogicClient.hasGraph(APP_NAME, SVC_OPERATION, null, "sync")) {
1821 respProps = svcLogicClient.execute(APP_NAME, SVC_OPERATION, null, "sync", parms);
1822 } catch (Exception e) {
1823 log.error("Caught exception executing service logic for {}", SVC_OPERATION, e);
1824 errorMessage = e.getMessage();
1828 errorMessage = NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'";
1831 } catch (Exception e) {
1833 errorMessage = e.getMessage();
1834 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
1837 if (respProps != null) {
1838 errorCode = respProps.getProperty(ERROR_CODE_PARAM);
1839 errorMessage = respProps.getProperty(ERROR_MESSAGE_PARAM);
1840 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1841 allottedResourceId = respProps.getProperty("allotted-resource-id");
1842 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1843 brgObjectPath = respProps.getProperty("brg-object-path");
1846 if (errorCode != null && errorCode.length() != 0 && !(errorCode.equals("0") || errorCode.equals("200"))) {
1847 responseBuilder.setResponseCode(errorCode);
1848 responseBuilder.setResponseMessage(errorMessage);
1849 responseBuilder.setAckFinalIndicator(ackFinal);
1851 log.error(RETURNED_FAILED_MESSAGE, SVC_OPERATION, siid, responseBuilder.build());
1853 RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder.<BrgTopologyOperationOutput>status(true)
1854 .withResult(responseBuilder.build()).build();
1855 return Futures.immediateFuture(rpcResult);
1858 // Got success from SLI
1862 BrgResponseInformationBuilder brgResponseInformationBuilder = new BrgResponseInformationBuilder();
1863 brgResponseInformationBuilder.setInstanceId(allottedResourceId);
1864 brgResponseInformationBuilder.setObjectPath(brgObjectPath);
1865 responseBuilder.setBrgResponseInformation(brgResponseInformationBuilder.build());
1867 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1868 serviceResponseInformationBuilder.setInstanceId(siid);
1869 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1870 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1872 } catch (IllegalStateException e) {
1873 log.error(UPDATING_MDSAL_ERROR_MESSAGE, SVC_OPERATION, siid, e);
1874 responseBuilder.setResponseCode("500");
1875 responseBuilder.setResponseMessage(e.toString());
1876 responseBuilder.setAckFinalIndicator("Y");
1877 log.error(RETURNED_FAILED_MESSAGE, SVC_OPERATION, siid, responseBuilder.build());
1878 RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder.<BrgTopologyOperationOutput>status(true)
1879 .withResult(responseBuilder.build()).build();
1880 return Futures.immediateFuture(rpcResult);
1884 responseBuilder.setResponseCode(errorCode);
1885 responseBuilder.setAckFinalIndicator(ackFinal);
1886 if (errorMessage != null) {
1887 responseBuilder.setResponseMessage(errorMessage);
1889 log.info(UPDATED_MDSAL_INFO_MESSAGE, SVC_OPERATION, siid);
1890 log.info(RETURNED_SUCCESS_MESSAGE, SVC_OPERATION, siid, responseBuilder.build());
1892 RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder.<BrgTopologyOperationOutput>status(true)
1893 .withResult(responseBuilder.build()).build();
1894 return Futures.immediateFuture(rpcResult);
1898 public Future<RpcResult<PreloadVnfTopologyOperationOutput>> preloadVnfTopologyOperation(
1899 PreloadVnfTopologyOperationInput input) {
1901 final String SVC_OPERATION = "preload-vnf-topology-operation";
1902 PreloadData preloadData;
1903 Properties parms = new Properties();
1905 log.info(CALLED_STR, SVC_OPERATION);
1906 // create a new response object
1907 PreloadVnfTopologyOperationOutputBuilder responseBuilder = new PreloadVnfTopologyOperationOutputBuilder();
1909 // Result from savePreloadData
1910 final SettableFuture<RpcResult<Void>> futureResult = SettableFuture.create();
1912 if (input == null || input.getVnfTopologyInformation() == null
1913 || input.getVnfTopologyInformation().getVnfTopologyIdentifier() == null) {
1914 log.debug("exiting {} because of null input", SVC_OPERATION);
1915 responseBuilder.setResponseCode("403");
1916 responseBuilder.setResponseMessage("invalid input: input is null");
1917 responseBuilder.setAckFinalIndicator("Y");
1918 RpcResult<PreloadVnfTopologyOperationOutput> rpcResult = RpcResultBuilder
1919 .<PreloadVnfTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1920 return Futures.immediateFuture(rpcResult);
1923 // Grab the name and type from the input buffer
1924 String preload_name = input.getVnfTopologyInformation().getVnfTopologyIdentifier().getVnfName();
1925 String preload_type = input.getVnfTopologyInformation().getVnfTopologyIdentifier().getVnfType();
1927 // Make sure we have a preload_name and preload_type
1928 if (preload_name == null || preload_name.length() == 0 || preload_type == null || preload_type.length() == 0) {
1929 log.debug("exiting {} vnf-name or vnf-type is null or empty", SVC_OPERATION);
1930 responseBuilder.setResponseCode("403");
1931 responseBuilder.setResponseMessage("invalid input: vnf-name or vnf-type is null or empty");
1932 responseBuilder.setAckFinalIndicator("Y");
1933 RpcResult<PreloadVnfTopologyOperationOutput> rpcResult = RpcResultBuilder
1934 .<PreloadVnfTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1935 return Futures.immediateFuture(rpcResult);
1938 if (input.getSdncRequestHeader() != null) {
1939 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1942 PreloadDataBuilder preloadDataBuilder = new PreloadDataBuilder();
1943 getPreloadData(preload_name, preload_type, preloadDataBuilder);
1945 PreloadDataBuilder operDataBuilder = new PreloadDataBuilder();
1946 getPreloadData(preload_name, preload_type, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
1948 // setup a preload-data object builder
1949 // ACTION preload-vnf-topology-operation
1951 // USES sdnc-request-header;
1952 // USES request-information;
1953 // uses vnf-topology-information;
1955 // USES vnf-topology-response-body;
1957 // container preload-data
1958 // uses vnf-topology-information;
1959 // uses network-topology-information;
1960 // uses oper-status;
1962 log.info("Adding INPUT data for {} [{},{}] input: {}", SVC_OPERATION, preload_name, preload_type, input);
1963 PreloadVnfTopologyOperationInputBuilder inputBuilder = new PreloadVnfTopologyOperationInputBuilder(input);
1964 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1965 log.info("Adding OPERATIONAL data for {} [{},{}] operational-data: {}", SVC_OPERATION, preload_name,
1966 preload_type, operDataBuilder.build());
1967 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
1969 // Call SLI sync method
1970 // Get SvcLogicService reference
1972 Properties respProps = null;
1974 String errorCode = "200";
1975 String errorMessage = null;
1976 String ackFinal = "Y";
1979 if (svcLogicClient.hasGraph(APP_NAME, SVC_OPERATION, null, "sync")) {
1982 respProps = svcLogicClient.execute(APP_NAME, SVC_OPERATION, null, "sync", preloadDataBuilder, parms);
1983 } catch (Exception e) {
1984 log.error("Caught exception executing service logic for {}", SVC_OPERATION, e);
1985 errorMessage = e.getMessage();
1989 errorMessage = NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'";
1992 } catch (Exception e) {
1994 errorMessage = e.getMessage();
1995 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
1998 if (respProps != null) {
1999 errorCode = respProps.getProperty(ERROR_CODE_PARAM);
2000 errorMessage = respProps.getProperty(ERROR_MESSAGE_PARAM);
2001 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2002 // internalError = respProps.getProperty("internal-error", "false");
2005 if (errorCode != null && errorCode.length() != 0 && !(errorCode.equals("0") || errorCode.equals("200"))) {
2007 responseBuilder.setResponseCode(errorCode);
2008 responseBuilder.setResponseMessage(errorMessage);
2009 responseBuilder.setAckFinalIndicator(ackFinal);
2011 VnfPreloadListBuilder preloadVnfListBuilder = new VnfPreloadListBuilder();
2012 preloadVnfListBuilder.setVnfName(preload_name);
2013 preloadVnfListBuilder.setVnfType(preload_type);
2014 preloadVnfListBuilder.setPreloadData(preloadDataBuilder.build());
2015 log.error("Returned FAILED for {} [{},{}] error code: '{}', Reason: '{}'", SVC_OPERATION, preload_name,
2016 preload_type, errorCode, errorMessage);
2018 savePreloadList(preloadVnfListBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
2019 } catch (Exception e) {
2020 log.error("Caught Exception updating MD-SAL for {} [{},{}] \n", SVC_OPERATION, preload_name,
2023 log.debug("Sending Success rpc result due to external error");
2024 RpcResult<PreloadVnfTopologyOperationOutput> rpcResult = RpcResultBuilder
2025 .<PreloadVnfTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2026 return Futures.immediateFuture(rpcResult);
2029 // Got success from SLI
2031 preloadData = preloadDataBuilder.build();
2032 log.info("Updating MD-SAL for {} [{},{}] preloadData: {}", SVC_OPERATION, preload_name, preload_type,
2034 // svc-configuration-list
2035 VnfPreloadListBuilder preloadVnfListBuilder = new VnfPreloadListBuilder();
2036 preloadVnfListBuilder.setVnfName(preload_name);
2037 preloadVnfListBuilder.setVnfType(preload_type);
2038 preloadVnfListBuilder.setPreloadData(preloadData);
2040 // merge flag sets to false to allow it to be overwritten (not appended)
2041 savePreloadList(preloadVnfListBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
2042 log.info("Updating OPERATIONAL tree.");
2043 savePreloadList(preloadVnfListBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
2044 } catch (Exception e) {
2045 log.error("Caught Exception updating MD-SAL for {} [{},{}] \n", SVC_OPERATION, preload_name, preload_type,
2047 responseBuilder.setResponseCode("500");
2048 responseBuilder.setResponseMessage(e.toString());
2049 responseBuilder.setAckFinalIndicator("Y");
2050 log.error("Returned FAILED for {} [{},{}] {}", SVC_OPERATION, preload_name, preload_type,
2051 responseBuilder.build());
2052 RpcResult<PreloadVnfTopologyOperationOutput> rpcResult = RpcResultBuilder
2053 .<PreloadVnfTopologyOperationOutput>status(false).withResult(responseBuilder.build()).build();
2054 return Futures.immediateFuture(rpcResult);
2058 responseBuilder.setResponseCode(errorCode);
2059 responseBuilder.setAckFinalIndicator(ackFinal);
2060 if (errorMessage != null) {
2061 responseBuilder.setResponseMessage(errorMessage);
2063 log.info("Updated MD-SAL for {} [{},{}]", SVC_OPERATION, preload_name, preload_type);
2064 log.info("Returned SUCCESS for {} [{},{}] {}", SVC_OPERATION, preload_name, preload_type,
2065 responseBuilder.build());
2067 RpcResult<PreloadVnfTopologyOperationOutput> rpcResult = RpcResultBuilder
2068 .<PreloadVnfTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2069 return Futures.immediateFuture(rpcResult);
2073 public Future<RpcResult<PreloadNetworkTopologyOperationOutput>> preloadNetworkTopologyOperation(
2074 PreloadNetworkTopologyOperationInput input) {
2076 final String SVC_OPERATION = "preload-network-topology-operation";
2077 PreloadData preloadData;
2078 Properties parms = new Properties();
2080 log.info(CALLED_STR, SVC_OPERATION);
2081 // create a new response object
2082 PreloadNetworkTopologyOperationOutputBuilder responseBuilder = new PreloadNetworkTopologyOperationOutputBuilder();
2084 // Result from savePreloadData
2085 final SettableFuture<RpcResult<Void>> futureResult = SettableFuture.create();
2087 if (input == null || input.getNetworkTopologyInformation() == null
2088 || input.getNetworkTopologyInformation().getNetworkTopologyIdentifier() == null) {
2090 log.debug("exiting {} because of null input", SVC_OPERATION);
2091 responseBuilder.setResponseCode("403");
2092 responseBuilder.setResponseMessage("input is null");
2093 responseBuilder.setAckFinalIndicator("Y");
2094 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2095 .<PreloadNetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2096 return Futures.immediateFuture(rpcResult);
2099 // Grab the name and type from the input buffer
2100 String preload_name = input.getNetworkTopologyInformation().getNetworkTopologyIdentifier().getNetworkName();
2101 String preload_type = input.getNetworkTopologyInformation().getNetworkTopologyIdentifier().getNetworkType();
2103 // Make sure we have a preload_name and preload_type
2104 if (preload_name == null || preload_name.length() == 0 || preload_type == null || preload_type.length() == 0) {
2105 log.debug("exiting {} because of invalid preload-name", SVC_OPERATION);
2106 responseBuilder.setResponseCode("403");
2107 responseBuilder.setResponseMessage("input, invalid preload-name");
2108 responseBuilder.setAckFinalIndicator("Y");
2109 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2110 .<PreloadNetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2111 return Futures.immediateFuture(rpcResult);
2114 if (input.getSdncRequestHeader() != null) {
2115 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
2118 PreloadDataBuilder preloadDataBuilder = new PreloadDataBuilder();
2119 getPreloadData(preload_name, preload_type, preloadDataBuilder);
2121 PreloadDataBuilder operDataBuilder = new PreloadDataBuilder();
2122 getPreloadData(preload_name, preload_type, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
2125 // setup a preload-data object builder
2126 // ACTION preload-network-topology-operation
2128 // USES sdnc-request-header;
2129 // USES request-information;
2130 // uses network-topology-information;
2132 // USES vnf-topology-response-body;
2134 // container preload-data
2135 // uses vnf-topology-information;
2136 // uses network-topology-information;
2137 // uses oper-status;
2139 log.info("Adding INPUT data for {} [{},{}] input: {}", SVC_OPERATION, preload_name, preload_type, input);
2140 PreloadNetworkTopologyOperationInputBuilder inputBuilder = new PreloadNetworkTopologyOperationInputBuilder(
2142 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
2143 log.info("Adding OPERATIONAL data for {} [{},{}] operational-data: {}", SVC_OPERATION, preload_name,
2144 preload_type, operDataBuilder.build());
2145 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
2147 // Call SLI sync method
2148 // Get SvcLogicService reference
2150 Properties respProps = null;
2152 String errorCode = "200";
2153 String errorMessage = null;
2154 String ackFinal = "Y";
2157 if (svcLogicClient.hasGraph(APP_NAME, SVC_OPERATION, null, "sync")) {
2160 respProps = svcLogicClient.execute(APP_NAME, SVC_OPERATION, null, "sync", preloadDataBuilder, parms);
2161 } catch (Exception e) {
2162 log.error("Caught exception executing service logic for {}", SVC_OPERATION, e);
2163 errorMessage = e.getMessage();
2167 errorMessage = NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + SVC_OPERATION + "'";
2170 } catch (Exception e) {
2172 errorMessage = e.getMessage();
2173 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
2176 if (respProps != null) {
2177 errorCode = respProps.getProperty(ERROR_CODE_PARAM);
2178 errorMessage = respProps.getProperty(ERROR_MESSAGE_PARAM);
2179 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2180 // internalError = respProps.getProperty("internal-error", "false");
2183 if (errorCode != null && errorCode.length() != 0 && !(errorCode.equals("0") || errorCode.equals("200"))) {
2185 responseBuilder.setResponseCode(errorCode);
2186 responseBuilder.setResponseMessage(errorMessage);
2187 responseBuilder.setAckFinalIndicator(ackFinal);
2189 VnfPreloadListBuilder preloadVnfListBuilder = new VnfPreloadListBuilder();
2190 preloadVnfListBuilder.setVnfName(preload_name);
2191 preloadVnfListBuilder.setVnfType(preload_type);
2192 preloadVnfListBuilder.setPreloadData(preloadDataBuilder.build());
2193 log.error("Returned FAILED for {} [{},{}] error code: '{}', Reason: '{}'", SVC_OPERATION, preload_name,
2194 preload_type, errorCode, errorMessage);
2196 savePreloadList(preloadVnfListBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
2197 } catch (Exception e) {
2198 log.error("Caught Exception updating MD-SAL for {} [{},{}] \n", SVC_OPERATION, preload_name,
2202 log.debug("Sending Success rpc result due to external error");
2203 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2204 .<PreloadNetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2205 return Futures.immediateFuture(rpcResult);
2208 // Got success from SLI
2210 preloadData = preloadDataBuilder.build();
2211 log.info("Updating MD-SAL for {} [{},{}] preloadData: {}", SVC_OPERATION, preload_name, preload_type,
2213 // svc-configuration-list
2214 VnfPreloadListBuilder preloadVnfListBuilder = new VnfPreloadListBuilder();
2215 preloadVnfListBuilder.setVnfName(preload_name);
2216 preloadVnfListBuilder.setVnfType(preload_type);
2217 preloadVnfListBuilder.setPreloadData(preloadData);
2219 // merge flag sets to false to allow it to be overwritten (not appended)
2220 savePreloadList(preloadVnfListBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
2221 log.info("Updating OPERATIONAL tree.");
2222 savePreloadList(preloadVnfListBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
2223 } catch (Exception e) {
2224 log.error("Caught Exception updating MD-SAL for " + SVC_OPERATION + " [" + preload_name + "," + preload_type
2226 responseBuilder.setResponseCode("500");
2227 responseBuilder.setResponseMessage(e.toString());
2228 responseBuilder.setAckFinalIndicator("Y");
2229 log.error("Returned FAILED for {} [{},{}] {}", SVC_OPERATION, preload_name, preload_type,
2230 responseBuilder.build());
2231 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2232 .<PreloadNetworkTopologyOperationOutput>status(false).withResult(responseBuilder.build()).build();
2233 return Futures.immediateFuture(rpcResult);
2237 responseBuilder.setResponseCode(errorCode);
2238 responseBuilder.setAckFinalIndicator(ackFinal);
2239 if (errorMessage != null) {
2240 responseBuilder.setResponseMessage(errorMessage);
2242 log.info("Updated MD-SAL for {} [{},{}]", SVC_OPERATION, preload_name, preload_type);
2243 log.info("Returned SUCCESS for {} [{},{}] {}", SVC_OPERATION, preload_name, preload_type,
2244 responseBuilder.build());
2246 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2247 .<PreloadNetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2248 return Futures.immediateFuture(rpcResult);