1 package org.onap.sdnc.northbound;
3 import com.google.common.base.Optional;
4 import com.google.common.util.concurrent.CheckedFuture;
5 import com.google.common.util.concurrent.Futures;
6 import com.google.common.util.concurrent.ListenableFuture;
8 import java.text.DateFormat;
9 import java.text.SimpleDateFormat;
10 import java.util.Date;
11 import java.util.Properties;
12 import java.util.TimeZone;
13 import java.util.concurrent.ExecutionException;
14 import java.util.concurrent.ExecutorService;
15 import java.util.concurrent.Executors;
16 import java.util.concurrent.Future;
18 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
19 import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
20 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
21 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
22 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
23 import org.opendaylight.controller.md.sal.common.api.data.OptimisticLockFailedException;
24 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
25 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
26 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
27 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.BrgTopologyOperationInput;
28 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.BrgTopologyOperationInputBuilder;
29 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.BrgTopologyOperationOutput;
30 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.BrgTopologyOperationOutputBuilder;
31 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ConnectionAttachmentTopologyOperationInput;
32 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ConnectionAttachmentTopologyOperationInputBuilder;
33 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ConnectionAttachmentTopologyOperationOutput;
34 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ConnectionAttachmentTopologyOperationOutputBuilder;
35 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationInput;
36 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationInputBuilder;
37 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationOutput;
38 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationOutputBuilder;
39 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.GENERICRESOURCEAPIService;
40 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.GenericConfigurationNotificationInput;
41 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.GenericConfigurationNotificationInputBuilder;
42 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.GenericConfigurationNotificationOutput;
43 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.GenericConfigurationTopologyOperationInput;
44 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.GenericConfigurationTopologyOperationInputBuilder;
45 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.GenericConfigurationTopologyOperationOutput;
46 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.GenericConfigurationTopologyOperationOutputBuilder;
47 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.GetpathsegmentTopologyOperationInput;
48 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.GetpathsegmentTopologyOperationInputBuilder;
49 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.GetpathsegmentTopologyOperationOutput;
50 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.GetpathsegmentTopologyOperationOutputBuilder;
51 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.NetworkTopologyOperationInput;
52 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.NetworkTopologyOperationInputBuilder;
53 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.NetworkTopologyOperationOutput;
54 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.NetworkTopologyOperationOutputBuilder;
55 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PolicyUpdateNotifyOperationInput;
56 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PolicyUpdateNotifyOperationInputBuilder;
57 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PolicyUpdateNotifyOperationOutput;
58 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PolicyUpdateNotifyOperationOutputBuilder;
59 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PortMirrorTopologyOperationInput;
60 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PortMirrorTopologyOperationInputBuilder;
61 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PortMirrorTopologyOperationOutput;
62 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PortMirrorTopologyOperationOutputBuilder;
63 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadInformation;
64 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadInformationBuilder;
65 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadNetworkTopologyOperationInput;
66 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadNetworkTopologyOperationInputBuilder;
67 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadNetworkTopologyOperationOutput;
68 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadNetworkTopologyOperationOutputBuilder;
69 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadVfModuleTopologyOperationInput;
70 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadVfModuleTopologyOperationInputBuilder;
71 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadVfModuleTopologyOperationOutput;
72 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PreloadVfModuleTopologyOperationOutputBuilder;
73 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.SecurityZoneTopologyOperationInput;
74 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.SecurityZoneTopologyOperationInputBuilder;
75 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.SecurityZoneTopologyOperationOutput;
76 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.SecurityZoneTopologyOperationOutputBuilder;
77 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServiceTopologyOperationInput;
78 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServiceTopologyOperationInputBuilder;
79 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServiceTopologyOperationOutput;
80 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServiceTopologyOperationOutputBuilder;
81 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.Services;
82 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ServicesBuilder;
83 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.TunnelxconnTopologyOperationInput;
84 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.TunnelxconnTopologyOperationInputBuilder;
85 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.TunnelxconnTopologyOperationOutput;
86 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.TunnelxconnTopologyOperationOutputBuilder;
87 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VfModuleTopologyOperationInput;
88 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VfModuleTopologyOperationInputBuilder;
89 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VfModuleTopologyOperationOutput;
90 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VfModuleTopologyOperationOutputBuilder;
91 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfGetResourceRequestInput;
92 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfGetResourceRequestInputBuilder;
93 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfGetResourceRequestOutput;
94 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfGetResourceRequestOutputBuilder;
95 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfTopologyOperationInput;
96 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfTopologyOperationInputBuilder;
97 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfTopologyOperationOutput;
98 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfTopologyOperationOutputBuilder;
99 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PnfTopologyOperationInput;
100 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PnfTopologyOperationInputBuilder;
101 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PnfTopologyOperationOutput;
102 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.PnfTopologyOperationOutputBuilder;
103 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.brg.response.information.BrgResponseInformationBuilder;
104 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.connection.attachment.response.information.ConnectionAttachmentResponseInformationBuilder;
105 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.contrail.route.response.information.ContrailRouteResponseInformationBuilder;
106 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.gc.response.information.GcResponseInformationBuilder;
107 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.network.response.information.NetworkResponseInformationBuilder;
108 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.port.mirror.response.information.PortMirrorResponseInformationBuilder;
109 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.data.PreloadData;
110 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.data.PreloadDataBuilder;
111 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.model.information.PreloadList;
112 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.model.information.PreloadListBuilder;
113 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.model.information.PreloadListKey;
114 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.request.information.RequestInformation;
115 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.sdnc.request.header.SdncRequestHeader;
116 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.sdnc.request.header.SdncRequestHeader.SvcAction;
117 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.security.zone.response.information.SecurityZoneResponseInformationBuilder;
118 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.data.ServiceData;
119 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.data.ServiceDataBuilder;
120 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.model.infrastructure.Service;
121 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.model.infrastructure.ServiceBuilder;
122 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.model.infrastructure.ServiceKey;
123 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.response.information.ServiceResponseInformationBuilder;
124 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.status.ServiceStatus.RequestStatus;
125 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.status.ServiceStatus.RpcAction;
126 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.service.status.ServiceStatusBuilder;
127 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.tunnelxconn.response.information.TunnelxconnResponseInformationBuilder;
128 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.vf.module.response.information.VfModuleResponseInformationBuilder;
129 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.vnf.response.information.VnfResponseInformationBuilder;
130 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.pnf.response.information.PnfResponseInformationBuilder;
131 import org.opendaylight.yangtools.yang.binding.DataObject;
132 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
133 import org.opendaylight.yangtools.yang.common.RpcResult;
134 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
135 import org.slf4j.Logger;
136 import org.slf4j.LoggerFactory;
139 * Defines a base implementation for your provider. This class extends from a
140 * helper class which provides storage for the most commonly used components of
141 * the MD-SAL. Additionally the base class provides some basic logging and
142 * initialization / clean up methods.
144 * To use this, copy and paste (overwrite) the following method into the
145 * TestApplicationProviderModule class which is auto generated under
146 * src/main/java in this project (created only once during first compilation):
151 * public java.lang.AutoCloseable createInstance() {
153 * // final GENERIC-RESOURCE-APIProvider provider = new
154 * // GENERIC-RESOURCE-APIProvider();
155 * final GenericResourceApiProvider provider = new GenericResourceApiProvider();
156 * provider.setDataBroker(getDataBrokerDependency());
157 * provider.setNotificationService(getNotificationServiceDependency());
158 * provider.setRpcRegistry(getRpcRegistryDependency());
159 * provider.initialize();
160 * return new AutoCloseable() {
163 * public void close() throws Exception {
164 * // TODO: CLOSE ANY REGISTRATION OBJECTS CREATED USING ABOVE
165 * // BROKER/NOTIFICATION
166 * // SERVIE/RPC REGISTRY
175 public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURCEAPIService {
177 protected static final String APP_NAME = "generic-resource-api";
178 private static final String CALLED_STR = "{} called.";
179 private static final String NULL_OR_EMPTY_ERROR_MESSAGE = "exiting {} because of null or empty service-instance-id";
180 protected static final String NULL_OR_EMPTY_ERROR_PARAM = "invalid input, null or empty service-instance-id";
181 private static final String ADDING_INPUT_DATA_LOG = "Adding INPUT data for {} [{}] input: {}";
182 private static final String ADDING_OPERATIONAL_DATA_LOG = "Adding OPERATIONAL data for {} [{}] operational-data: {}";
183 private static final String OPERATIONAL_DATA_PARAM = "operational-data";
184 protected static final String NO_SERVICE_LOGIC_ACTIVE = "No service logic active for ";
185 private static final String SERVICE_LOGIC_SEARCH_ERROR_MESSAGE = "Caught exception looking for service logic";
186 private static final String ERROR_CODE_PARAM = "error-code";
187 private static final String ERROR_MESSAGE_PARAM = "error-message";
188 private static final String ACK_FINAL_PARAM = "ack-final";
189 private static final String SERVICE_OBJECT_PATH_PARAM = "service-object-path";
190 private static final String NETWORK_OBJECT_PATH_PARAM = "network-object-path";
191 private static final String VNF_OBJECT_PATH_PARAM = "vnf-object-path";
192 private static final String PNF_OBJECT_PATH_PARAM = "pnf-object-path";
193 private static final String VF_MODULE_OBJECT_PATH_PARAM = "vf-module-object-path";
194 private static final String VF_MODULE_ID_PARAM = "vf-module-id";
195 private static final String UPDATING_MDSAL_ERROR_MESSAGE = "Caught Exception updating MD-SAL for {} [{}] \n";
196 private static final String UPDATING_MDSAL_ERROR_MESSAGE_2 = "Caught Exception updating MD-SAL for {} [{},{}] \n";
197 private static final String RETURNED_FAILED_MESSAGE = "Returned FAILED for {} [{}] {}";
198 private static final String UPDATING_MDSAL_INFO_MESSAGE = "Updating MD-SAL for {} [{}] ServiceData: {}";
199 private static final String UPDATED_MDSAL_INFO_MESSAGE = "Updated MD-SAL for {} [{}]";
200 private static final String RETURNED_SUCCESS_MESSAGE = "Returned SUCCESS for {} [{}] {}";
201 private static final String NON_NULL_PARAM = "non-null";
202 private static final String NULL_PARAM = "null";
203 private static final String SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE = "Caught exception executing service logic for {} ";
204 private static final String UPDATING_TREE_INFO_MESSAGE = "Updating OPERATIONAL tree.";
205 private static final String EMPTY_SERVICE_INSTANCE_MESSAGE = "exiting {} because the service-instance does not have any service data in SDNC";
206 protected static final String INVALID_INPUT_ERROR_MESSAGE = "invalid input: the service-instance does not have any service data in SDNC";
207 private static final String ALLOTTED_RESOURCE_ID_PARAM = "allotted-resource-id";
208 private static final String ERROR_NETWORK_ID = "error";
209 private static final String BACKGROUND_THREAD_STARTED_MESSAGE = "Start background thread";
210 private static final String BACKGROUND_THREAD_INFO = "Background thread: input conf_id is {}";
212 private final Logger log = LoggerFactory.getLogger(GenericResourceApiProvider.class);
213 private final ExecutorService executor;
214 private final GenericResourceApiSvcLogicServiceClient svcLogicClient;
216 protected DataBroker dataBroker;
217 protected NotificationPublishService notificationService;
218 protected RpcProviderRegistry rpcRegistry;
219 protected BindingAwareBroker.RpcRegistration<GENERICRESOURCEAPIService> rpcRegistration;
221 public GenericResourceApiProvider(DataBroker dataBroker, NotificationPublishService notificationPublishService,
222 RpcProviderRegistry rpcProviderRegistry, GenericResourceApiSvcLogicServiceClient client) {
223 log.info("Creating provider for {}", APP_NAME);
224 executor = Executors.newFixedThreadPool(1);
225 setDataBroker(dataBroker);
226 setNotificationService(notificationPublishService);
227 setRpcRegistry(rpcProviderRegistry);
228 svcLogicClient = client;
233 public void initialize() {
234 log.info("Initializing provider for {}", APP_NAME);
235 // Create the top level containers
238 GenericResourceApiUtil.loadProperties();
239 } catch (Exception e) {
240 log.error("Caught Exception while trying to load properties file", e);
243 log.info("Initialization complete for {}", APP_NAME);
246 protected void initializeChild() {
247 // Override if you have custom initialization intelligence
251 public void close() throws Exception {
252 log.info("Closing provider for {}", APP_NAME);
254 rpcRegistration.close();
255 log.info("Successfully closed provider for {}", APP_NAME);
258 private static class Iso8601Util {
260 private static TimeZone timeZone = TimeZone.getTimeZone("UTC");
261 private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
263 private Iso8601Util() {
267 dateFormat.setTimeZone(timeZone);
270 private static String now() {
271 return dateFormat.format(new Date());
275 public void setDataBroker(DataBroker dataBroker) {
276 this.dataBroker = dataBroker;
277 if (log.isDebugEnabled()) {
278 log.debug("DataBroker set to {}", dataBroker == null ? NULL_PARAM : NON_NULL_PARAM);
282 public void setNotificationService(NotificationPublishService notificationService) {
283 this.notificationService = notificationService;
284 if (log.isDebugEnabled()) {
285 log.debug("Notification Service set to {}", notificationService == null ? NULL_PARAM : NON_NULL_PARAM);
289 public void setRpcRegistry(RpcProviderRegistry rpcRegistry) {
290 this.rpcRegistry = rpcRegistry;
291 if (log.isDebugEnabled()) {
292 log.debug("RpcRegistry set to {}", rpcRegistry == null ? NULL_PARAM : NON_NULL_PARAM);
296 private void createContainers() {
298 final WriteTransaction t = dataBroker.newReadWriteTransaction();
300 // Create the service-instance container
301 t.merge(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Services.class),
302 new ServicesBuilder().build());
303 t.merge(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Services.class),
304 new ServicesBuilder().build());
306 // Create the PreloadInformation container
307 t.merge(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(PreloadInformation.class),
308 new PreloadInformationBuilder().build());
309 t.merge(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(PreloadInformation.class),
310 new PreloadInformationBuilder().build());
313 CheckedFuture<Void, TransactionCommitFailedException> checkedFuture = t.submit();
315 log.info("Create containers succeeded!");
317 } catch (InterruptedException | ExecutionException e) {
318 log.error("Create containers failed: ", e);
322 private void setServiceStatus(ServiceStatusBuilder serviceStatusBuilder, String errorCode, String errorMessage,
324 serviceStatusBuilder.setResponseCode(errorCode);
325 serviceStatusBuilder.setResponseMessage(errorMessage);
326 serviceStatusBuilder.setFinalIndicator(ackFinal);
327 serviceStatusBuilder.setResponseTimestamp(Iso8601Util.now());
330 private void setServiceStatus(ServiceStatusBuilder serviceStatusBuilder, RequestInformation requestInformation) {
331 if (requestInformation != null && requestInformation.getRequestAction() != null) {
332 serviceStatusBuilder.setAction(requestInformation.getRequestAction().toString());
336 private void setServiceStatus(ServiceStatusBuilder serviceStatusBuilder, SdncRequestHeader requestHeader) {
337 if (requestHeader != null && requestHeader.getSvcAction() != null) {
338 switch (requestHeader.getSvcAction()) {
340 serviceStatusBuilder.setRpcAction(RpcAction.Assign);
343 serviceStatusBuilder.setRpcAction(RpcAction.Unassign);
346 serviceStatusBuilder.setRpcAction(RpcAction.Activate);
349 serviceStatusBuilder.setRpcAction(RpcAction.Deactivate);
352 serviceStatusBuilder.setRpcAction(RpcAction.Delete);
355 serviceStatusBuilder.setRpcAction(RpcAction.Create);
358 log.error("Unknown SvcAction: {}", requestHeader.getSvcAction());
364 private void getServiceData(String siid, ServiceDataBuilder serviceDataBuilder) {
366 getServiceData(siid, serviceDataBuilder, LogicalDatastoreType.CONFIGURATION);
369 private void getServiceData(String siid, ServiceDataBuilder serviceDataBuilder, LogicalDatastoreType type) {
370 // See if any data exists yet for this siid, if so grab it.
371 InstanceIdentifier<Service> serviceInstanceIdentifier = InstanceIdentifier.builder(Services.class)
372 .child(Service.class, new ServiceKey(siid)).build();
374 ReadOnlyTransaction readTx = dataBroker.newReadOnlyTransaction();
375 Optional<Service> data = Optional.absent();
377 data = readTx.read(type, serviceInstanceIdentifier).get();
378 } catch (InterruptedException | ExecutionException e) {
379 log.error("Caught Exception reading MD-SAL ({}) data for [{}] ", type, siid, e);
382 if (data != null && data.isPresent()) {
383 ServiceData serviceData = data.get().getServiceData();
384 if (serviceData != null) {
385 log.info("Read MD-SAL ({}) data for [{}] ServiceData: {}", type, siid, serviceData);
386 serviceDataBuilder.setSdncRequestHeader(serviceData.getSdncRequestHeader());
387 serviceDataBuilder.setRequestInformation(serviceData.getRequestInformation());
388 serviceDataBuilder.setServiceInformation(serviceData.getServiceInformation());
389 serviceDataBuilder.setServiceRequestInput(serviceData.getServiceRequestInput());
390 serviceDataBuilder.setServiceTopology(serviceData.getServiceTopology());
391 serviceDataBuilder.setServiceLevelOperStatus(serviceData.getServiceLevelOperStatus());
392 serviceDataBuilder.setNetworks(serviceData.getNetworks());
393 serviceDataBuilder.setVnfs(serviceData.getVnfs());
394 serviceDataBuilder.setProvidedAllottedResources(serviceData.getProvidedAllottedResources());
395 serviceDataBuilder.setConsumedAllottedResources(serviceData.getConsumedAllottedResources());
396 serviceDataBuilder.setNetworkInstanceGroups(serviceData.getNetworkInstanceGroups());
397 serviceDataBuilder.setVnfcInstanceGroups(serviceData.getVnfcInstanceGroups());
398 serviceDataBuilder.setForwardingPaths(serviceData.getForwardingPaths());
399 serviceDataBuilder.setProvidedConfigurations(serviceData.getProvidedConfigurations());
400 // service-instance-id needs to be set
402 log.info("No service-data found in MD-SAL ({}) for [{}]", type, siid);
405 log.info("No data found in MD-SAL ({}) for [{}]", type, siid);
409 private void saveService(final Service entry, boolean merge, LogicalDatastoreType storeType) {
410 // Each entry will be identifiable by a unique key, we have to create that
412 InstanceIdentifier<Service> path = InstanceIdentifier.builder(Services.class)
413 .child(Service.class, entry.key()).build();
415 trySaveEntry(entry, merge, storeType, path);
418 private <T extends DataObject> void trySaveEntry(T entry, boolean merge, LogicalDatastoreType storeType,
419 InstanceIdentifier<T> path) {
423 save(entry, merge, storeType, path);
425 } catch (OptimisticLockFailedException e) {
427 log.debug("Got OptimisticLockFailedException on last try - failing ");
428 throw new IllegalStateException(e);
430 log.debug("Got OptimisticLockFailedException - trying again ");
431 } catch (TransactionCommitFailedException ex) {
432 log.debug("Update DataStore failed");
433 throw new IllegalStateException(ex);
438 private <T extends DataObject> void save(T entry, boolean merge, LogicalDatastoreType storeType,
439 InstanceIdentifier<T> path) 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.builder(Services.class)
454 .child(Service.class, entry.key()).build();
456 tryDeleteEntry(storeType, path);
459 private void tryDeleteEntry(LogicalDatastoreType storeType, InstanceIdentifier<Service> path) {
463 delete(storeType, path);
465 } catch (OptimisticLockFailedException e) {
467 log.debug("Got OptimisticLockFailedException on last try - failing ");
468 throw new IllegalStateException(e);
470 log.debug("Got OptimisticLockFailedException - trying again ");
471 } catch (TransactionCommitFailedException ex) {
472 log.debug("Update DataStore failed");
473 throw new IllegalStateException(ex);
478 private void delete(LogicalDatastoreType storeType, InstanceIdentifier<Service> path)
479 throws TransactionCommitFailedException {
480 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
481 tx.delete(storeType, path);
482 tx.submit().checkedGet();
483 log.debug("DataStore delete succeeded");
486 private void getPreloadData(String vnf_name, String vnf_type, PreloadDataBuilder preloadDataBuilder) {
488 getPreloadData(vnf_name, vnf_type, preloadDataBuilder, LogicalDatastoreType.CONFIGURATION);
491 private void getPreloadData(String preloadName, String preloadType, PreloadDataBuilder preloadDataBuilder,
492 LogicalDatastoreType type) {
493 // See if any data exists yet for this name/type, if so grab it.
494 InstanceIdentifier preloadInstanceIdentifier = InstanceIdentifier
495 .<PreloadInformation>builder(PreloadInformation.class)
496 .child(PreloadList.class, new PreloadListKey(preloadName, preloadType)).build();
497 ReadOnlyTransaction readTx = dataBroker.newReadOnlyTransaction();
498 Optional<PreloadList> data = null;
500 data = (Optional<PreloadList>) readTx.read(type, preloadInstanceIdentifier).get();
501 } catch (InterruptedException | ExecutionException e) {
502 log.error("Caught Exception reading MD-SAL ({}) for [{},{}] ", type, preloadName, preloadType, e);
505 if (data != null && data.isPresent()) {
506 PreloadData preloadData = data.get().getPreloadData();
507 if (preloadData != null) {
508 log.info("Read MD-SAL ({}) data for [{},{}] PreloadData: {}", type, preloadName, preloadType,
511 .setPreloadVfModuleTopologyInformation(preloadData.getPreloadVfModuleTopologyInformation());
513 .setPreloadNetworkTopologyInformation(preloadData.getPreloadNetworkTopologyInformation());
514 preloadDataBuilder.setPreloadOperStatus(preloadData.getPreloadOperStatus());
516 log.info("No preload-data found in MD-SAL ({}) for [{},{}] ", type, preloadName, preloadType);
519 log.info("No data found in MD-SAL ({}) for [{},{}] ", type, preloadName, preloadType);
523 private void savePreloadList(final PreloadList entry, boolean merge, LogicalDatastoreType storeType)
524 throws IllegalStateException {
526 // Each entry will be identifiable by a unique key, we have to create that
528 InstanceIdentifier.InstanceIdentifierBuilder<PreloadList> preloadListBuilder = InstanceIdentifier
529 .<PreloadInformation>builder(PreloadInformation.class).child(PreloadList.class, entry.key());
530 InstanceIdentifier<PreloadList> path = preloadListBuilder.build();
534 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
536 tx.merge(storeType, path, entry);
538 tx.put(storeType, path, entry);
540 tx.submit().checkedGet();
541 log.debug("Update DataStore succeeded");
543 } catch (final TransactionCommitFailedException e) {
544 if (e instanceof OptimisticLockFailedException) {
546 log.debug("Got OptimisticLockFailedException on last try - failing ");
547 throw new IllegalStateException(e);
549 log.debug("Got OptimisticLockFailedException - trying again ");
551 log.debug("Update DataStore failed");
552 throw new IllegalStateException(e);
558 private void deletePreloadList(final PreloadList entry, LogicalDatastoreType storeType) {
559 // Each entry will be identifiable by a unique key, we have to create
561 InstanceIdentifier<PreloadList> path = InstanceIdentifier.builder(PreloadInformation.class)
562 .child(PreloadList.class, entry.key()).build();
564 tryDeletePreloadListEntry(storeType, path);
567 private void tryDeletePreloadListEntry(LogicalDatastoreType storeType, InstanceIdentifier<PreloadList> path) {
571 deletePreloadList(storeType, path);
573 } catch (OptimisticLockFailedException e) {
575 log.debug("Got OptimisticLockFailedException on last try - failing ");
576 throw new IllegalStateException(e);
578 log.debug("Got OptimisticLockFailedException - trying again ");
579 } catch (TransactionCommitFailedException ex) {
580 log.debug("Update DataStore failed");
581 throw new IllegalStateException(ex);
586 private void deletePreloadList(LogicalDatastoreType storeType, InstanceIdentifier<PreloadList> path)
587 throws TransactionCommitFailedException {
588 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
589 tx.delete(storeType, path);
590 tx.submit().checkedGet();
591 log.debug("DataStore delete succeeded");
595 public ListenableFuture<RpcResult<ServiceTopologyOperationOutput>> serviceTopologyOperation(
596 ServiceTopologyOperationInput input) {
598 final String svcOperation = "service-topology-operation";
599 ServiceData serviceData;
600 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
601 Properties parms = new Properties();
603 log.info(CALLED_STR, svcOperation);
604 // create a new response object
605 ServiceTopologyOperationOutputBuilder responseBuilder = new ServiceTopologyOperationOutputBuilder();
607 if (hasInvalidServiceId(input)) {
608 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
609 responseBuilder.setResponseCode("404");
610 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
611 responseBuilder.setAckFinalIndicator("Y");
613 RpcResult<ServiceTopologyOperationOutput> rpcResult = RpcResultBuilder
614 .<ServiceTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
616 return Futures.immediateFuture(rpcResult);
619 // Grab the service instance ID from the input buffer
620 String siid = input.getServiceInformation().getServiceInstanceId();
622 trySetSvcRequestId(input, responseBuilder);
624 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
625 getServiceData(siid, serviceDataBuilder);
627 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
628 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
630 // Set the serviceStatus based on input
631 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
632 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
635 * // setup a service-data object builder // ACTION service-topology-operation
636 * // INPUT: // USES uses service-operation-information // OUTPUT: // uses
637 * topology-response-common; // uses service-response-information;
640 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
641 ServiceTopologyOperationInputBuilder inputBuilder = new ServiceTopologyOperationInputBuilder(input);
642 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
644 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
645 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
647 // Call SLI sync method
648 ResponseObject responseObject = new ResponseObject("200", "");
649 String ackFinal = "Y";
650 String serviceObjectPath = null;
651 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
653 if (respProps != null) {
654 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
655 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
656 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
657 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
660 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
661 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
662 serviceStatusBuilder.setRpcName(svcOperation);
664 if (failed(responseObject)) {
665 responseBuilder.setResponseCode(responseObject.getStatusCode());
666 responseBuilder.setResponseMessage(responseObject.getMessage());
667 responseBuilder.setAckFinalIndicator(ackFinal);
669 ServiceBuilder serviceBuilder = new ServiceBuilder();
670 serviceBuilder.setServiceInstanceId(siid);
671 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
673 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
674 } catch (Exception e) {
675 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
677 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
679 RpcResult<ServiceTopologyOperationOutput> rpcResult = RpcResultBuilder
680 .<ServiceTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
682 return Futures.immediateFuture(rpcResult);
685 // Got success from SLI
687 serviceData = serviceDataBuilder.build();
688 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
691 ServiceBuilder serviceBuilder = new ServiceBuilder();
692 serviceBuilder.setServiceData(serviceData);
693 serviceBuilder.setServiceInstanceId(siid);
694 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
695 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
697 tryDeleteService(input, serviceBuilder);
699 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
700 serviceResponseInformationBuilder.setInstanceId(siid);
701 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
702 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
704 } catch (Exception e) {
705 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
706 responseBuilder.setResponseCode("500");
707 responseBuilder.setResponseMessage(e.getMessage());
708 responseBuilder.setAckFinalIndicator("Y");
709 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
711 RpcResult<ServiceTopologyOperationOutput> rpcResult = RpcResultBuilder
712 .<ServiceTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
714 return Futures.immediateFuture(rpcResult);
718 responseBuilder.setResponseCode(responseObject.getStatusCode());
719 responseBuilder.setAckFinalIndicator(ackFinal);
720 trySetResponseMessage(responseBuilder, responseObject);
721 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
722 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
724 RpcResult<ServiceTopologyOperationOutput> rpcResult = RpcResultBuilder
725 .<ServiceTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
727 return Futures.immediateFuture(rpcResult);
730 private void trySetResponseMessage(ServiceTopologyOperationOutputBuilder responseBuilder,
731 ResponseObject responseObject) {
732 if (responseObject.getMessage() != null) {
733 responseBuilder.setResponseMessage(responseObject.getMessage());
737 private boolean hasInvalidServiceId(ServiceTopologyOperationInput input) {
738 return input == null || input.getServiceInformation() == null
739 || input.getServiceInformation().getServiceInstanceId() == null
740 || input.getServiceInformation().getServiceInstanceId().length() == 0;
743 private void trySetSvcRequestId(ServiceTopologyOperationInput input,
744 ServiceTopologyOperationOutputBuilder responseBuilder) {
745 if (input.getSdncRequestHeader() != null) {
746 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
750 private void tryDeleteService(ServiceTopologyOperationInput input, ServiceBuilder serviceBuilder) {
751 if (isValidRequest(input) && input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete)) {
752 // Only update operational tree on delete
753 log.info("Delete from both CONFIGURATION and OPERATIONAL tree.");
754 deleteService(serviceBuilder.build(), LogicalDatastoreType.OPERATIONAL);
755 deleteService(serviceBuilder.build(), LogicalDatastoreType.CONFIGURATION);
759 private Properties tryGetProperties(String svcOperation, Properties parms, ServiceDataBuilder serviceDataBuilder,
760 ResponseObject responseObject) {
762 if (svcLogicClient.hasGraph(APP_NAME, svcOperation, null, "sync")) {
764 return svcLogicClient.execute(APP_NAME, svcOperation, null, "sync", serviceDataBuilder, parms);
765 } catch (Exception e) {
766 log.error(SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE, svcOperation, e);
767 responseObject.setMessage(e.getMessage());
768 responseObject.setStatusCode("500");
771 responseObject.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
772 responseObject.setStatusCode("503");
774 } catch (Exception e) {
775 responseObject.setMessage(e.getMessage());
776 responseObject.setStatusCode("500");
777 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
783 private boolean failed(ResponseObject error) {
784 return !error.getStatusCode().isEmpty()
785 && !("0".equals(error.getStatusCode()) || "200".equals(error.getStatusCode()));
788 private boolean isValidRequest(ServiceTopologyOperationInput input) {
789 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
794 public ListenableFuture<RpcResult<PnfTopologyOperationOutput>> pnfTopologyOperation(PnfTopologyOperationInput input) {
796 final String svcOperation = "pnf-topology-operation";
797 ServiceData serviceData;
798 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
799 Properties properties = new Properties();
801 log.info(CALLED_STR, svcOperation);
802 // create a new response object
803 PnfTopologyOperationOutputBuilder responseBuilder = new PnfTopologyOperationOutputBuilder();
805 if (hasInvalidServiceId(input)) {
806 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
807 responseBuilder.setResponseCode("404");
808 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
809 responseBuilder.setAckFinalIndicator("Y");
810 RpcResult<PnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<PnfTopologyOperationOutput>status(true)
811 .withResult(responseBuilder.build()).build();
813 return Futures.immediateFuture(rpcResult);
816 // Grab the service instance ID from the input buffer
817 String siid = input.getServiceInformation().getServiceInstanceId();
819 trySetSvcRequestId(input, responseBuilder);
821 /* Comment out mandatory check for pnf id for scenario wherein for assign/create request pnf-id is generated by
823 if (hasInvalidPnfId(input)) {
824 log.debug("exiting {} because of null or empty pnf-id", svcOperation);
825 responseBuilder.setResponseCode("404");
826 responseBuilder.setResponseMessage("invalid input, null or empty pnf-id");
827 responseBuilder.setAckFinalIndicator("Y");
829 RpcResult<PnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<PnfTopologyOperationOutput>status(true)
830 .withResult(responseBuilder.build()).build();
832 return Futures.immediateFuture(rpcResult);
836 String pnfId = input.getPnfDetails().getPnfId();
837 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
838 getServiceData(siid, serviceDataBuilder);
840 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
841 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
843 // Set the serviceStatus based on input
844 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
845 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
848 // setup a service-data object builder
849 // ACTION pnf-topology-operation
851 // USES sdnc-request-header;
852 // USES request-information;
853 // USES service-information;
856 // USES pnf-topology-response-body;
858 // USES service-information
862 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
863 PnfTopologyOperationInputBuilder inputBuilder = new PnfTopologyOperationInputBuilder(input);
864 GenericResourceApiUtil.toProperties(properties, inputBuilder.build());
866 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
867 GenericResourceApiUtil.toProperties(properties, OPERATIONAL_DATA_PARAM, operDataBuilder);
869 // Call SLI sync method
871 ResponseObject responseObject = new ResponseObject("200", "");
872 String ackFinal = "Y";
873 String serviceObjectPath = null;
874 String pnfObjectPath = null;
875 Properties respProps = tryGetProperties(svcOperation, properties, serviceDataBuilder, responseObject);
877 if (respProps != null) {
878 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
879 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
880 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
882 pnfId = respProps.getProperty("pnfId");
884 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
885 pnfObjectPath = respProps.getProperty(PNF_OBJECT_PATH_PARAM);
888 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
889 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
890 serviceStatusBuilder.setRpcName(svcOperation);
892 if (failed(responseObject)) {
893 responseBuilder.setResponseCode(responseObject.getStatusCode());
894 responseBuilder.setResponseMessage(responseObject.getMessage());
895 responseBuilder.setAckFinalIndicator(ackFinal);
897 ServiceBuilder serviceBuilder = new ServiceBuilder();
898 serviceBuilder.setServiceInstanceId(siid);
899 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
901 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
902 trySaveService(input, serviceBuilder);
903 } catch (Exception e) {
904 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
906 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
908 RpcResult<PnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<PnfTopologyOperationOutput>status(true)
909 .withResult(responseBuilder.build()).build();
912 return Futures.immediateFuture(rpcResult);
915 // Got success from SLI
917 serviceData = serviceDataBuilder.build();
918 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
921 ServiceBuilder serviceBuilder = new ServiceBuilder();
922 serviceBuilder.setServiceData(serviceData);
923 serviceBuilder.setServiceInstanceId(siid);
924 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
925 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
927 if (isValidRequest(input) && input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)) {
928 // Only update operational tree on Assign
929 log.info(UPDATING_TREE_INFO_MESSAGE);
930 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
933 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
934 serviceResponseInformationBuilder.setInstanceId(siid);
935 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
936 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
938 PnfResponseInformationBuilder pnfResponseInformationBuilder = new PnfResponseInformationBuilder();
939 pnfResponseInformationBuilder.setInstanceId(pnfId);
940 pnfResponseInformationBuilder.setObjectPath(pnfObjectPath);
941 responseBuilder.setPnfResponseInformation(pnfResponseInformationBuilder.build());
943 } catch (Exception e) {
944 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
945 responseBuilder.setResponseCode("500");
946 responseBuilder.setResponseMessage(e.getMessage());
947 responseBuilder.setAckFinalIndicator("Y");
948 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
950 RpcResult<PnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<PnfTopologyOperationOutput>status(true)
951 .withResult(responseBuilder.build()).build();
953 return Futures.immediateFuture(rpcResult);
957 responseBuilder.setResponseCode(responseObject.getStatusCode());
958 responseBuilder.setAckFinalIndicator(ackFinal);
959 trySetResponseMessage(responseBuilder, responseObject);
960 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
961 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
963 RpcResult<PnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<PnfTopologyOperationOutput>status(true)
964 .withResult(responseBuilder.build()).build();
967 return Futures.immediateFuture(rpcResult);
970 private void trySetResponseMessage(PnfTopologyOperationOutputBuilder responseBuilder,
971 ResponseObject responseObject) {
972 if (responseObject.getMessage() != null) {
973 responseBuilder.setResponseMessage(responseObject.getMessage());
977 private void trySaveService(PnfTopologyOperationInput input, ServiceBuilder serviceBuilder) {
978 if (isValidRequest(input) && (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete)
979 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
981 // Only update operational tree on activate or delete
982 log.info(UPDATING_TREE_INFO_MESSAGE);
983 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
987 private boolean hasInvalidPnfId(PnfTopologyOperationInput input) {
988 return input.getPnfDetails() == null || input.getPnfDetails().getPnfId() == null
989 || input.getPnfDetails().getPnfId().length() == 0;
992 private boolean hasInvalidServiceId(PnfTopologyOperationInput input) {
993 return input == null || input.getServiceInformation() == null
994 || input.getServiceInformation().getServiceInstanceId() == null
995 || input.getServiceInformation().getServiceInstanceId().length() == 0;
998 private void trySetSvcRequestId(PnfTopologyOperationInput input,
999 PnfTopologyOperationOutputBuilder responseBuilder) {
1000 if (input.getSdncRequestHeader() != null) {
1001 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1005 private boolean isValidRequest(PnfTopologyOperationInput input) {
1006 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
1011 public ListenableFuture<RpcResult<VnfTopologyOperationOutput>> vnfTopologyOperation(VnfTopologyOperationInput input) {
1013 final String svcOperation = "vnf-topology-operation";
1014 ServiceData serviceData;
1015 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1016 Properties properties = new Properties();
1018 log.info(CALLED_STR, svcOperation);
1019 // create a new response object
1020 VnfTopologyOperationOutputBuilder responseBuilder = new VnfTopologyOperationOutputBuilder();
1022 if (hasInvalidServiceId(input)) {
1023 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
1024 responseBuilder.setResponseCode("404");
1025 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
1026 responseBuilder.setAckFinalIndicator("Y");
1027 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<VnfTopologyOperationOutput>status(true)
1028 .withResult(responseBuilder.build()).build();
1030 return Futures.immediateFuture(rpcResult);
1033 // Grab the service instance ID from the input buffer
1034 String siid = input.getServiceInformation().getServiceInstanceId();
1036 trySetSvcRequestId(input, responseBuilder);
1038 /* Comment out mandatory check for vnf id for scenario wherein for assign/create request vnf-id is generated by
1040 if (hasInvalidVnfId(input)) {
1041 log.debug("exiting {} because of null or empty vnf-id", svcOperation);
1042 responseBuilder.setResponseCode("404");
1043 responseBuilder.setResponseMessage("invalid input, null or empty vnf-id");
1044 responseBuilder.setAckFinalIndicator("Y");
1046 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<VnfTopologyOperationOutput>status(true)
1047 .withResult(responseBuilder.build()).build();
1049 return Futures.immediateFuture(rpcResult);
1053 String vnfId = input.getVnfInformation().getVnfId();
1054 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1055 getServiceData(siid, serviceDataBuilder);
1057 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
1058 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
1060 // Set the serviceStatus based on input
1061 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
1062 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
1065 // setup a service-data object builder
1066 // ACTION vnf-topology-operation
1068 // USES sdnc-request-header;
1069 // USES request-information;
1070 // USES service-information;
1071 // USES vnf-request-information
1073 // USES vnf-topology-response-body;
1074 // USES vnf-information
1075 // USES service-information
1077 // container service-data
1078 // uses vnf-configuration-information;
1079 // uses oper-status;
1081 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
1082 VnfTopologyOperationInputBuilder inputBuilder = new VnfTopologyOperationInputBuilder(input);
1083 GenericResourceApiUtil.toProperties(properties, inputBuilder.build());
1085 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
1086 GenericResourceApiUtil.toProperties(properties, OPERATIONAL_DATA_PARAM, operDataBuilder);
1088 // Call SLI sync method
1090 ResponseObject responseObject = new ResponseObject("200", "");
1091 String ackFinal = "Y";
1092 String serviceObjectPath = null;
1093 String vnfObjectPath = null;
1094 Properties respProps = tryGetProperties(svcOperation, properties, serviceDataBuilder, responseObject);
1096 if (respProps != null) {
1097 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1098 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1099 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1100 if (vnfId == null) {
1101 vnfId = respProps.getProperty("vnfId");
1103 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1104 vnfObjectPath = respProps.getProperty(VNF_OBJECT_PATH_PARAM);
1107 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
1108 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
1109 serviceStatusBuilder.setRpcName(svcOperation);
1111 if (failed(responseObject)) {
1112 responseBuilder.setResponseCode(responseObject.getStatusCode());
1113 responseBuilder.setResponseMessage(responseObject.getMessage());
1114 responseBuilder.setAckFinalIndicator(ackFinal);
1116 ServiceBuilder serviceBuilder = new ServiceBuilder();
1117 serviceBuilder.setServiceInstanceId(siid);
1118 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1120 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
1121 trySaveService(input, serviceBuilder);
1122 } catch (Exception e) {
1123 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1125 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1127 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<VnfTopologyOperationOutput>status(true)
1128 .withResult(responseBuilder.build()).build();
1131 return Futures.immediateFuture(rpcResult);
1134 // Got success from SLI
1136 serviceData = serviceDataBuilder.build();
1137 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
1140 ServiceBuilder serviceBuilder = new ServiceBuilder();
1141 serviceBuilder.setServiceData(serviceData);
1142 serviceBuilder.setServiceInstanceId(siid);
1143 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1144 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1146 if (isValidRequest(input) && input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)) {
1147 // Only update operational tree on Assign
1148 log.info(UPDATING_TREE_INFO_MESSAGE);
1149 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1152 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1153 serviceResponseInformationBuilder.setInstanceId(siid);
1154 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1155 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1157 VnfResponseInformationBuilder vnfResponseInformationBuilder = new VnfResponseInformationBuilder();
1158 vnfResponseInformationBuilder.setInstanceId(vnfId);
1159 vnfResponseInformationBuilder.setObjectPath(vnfObjectPath);
1160 responseBuilder.setVnfResponseInformation(vnfResponseInformationBuilder.build());
1162 } catch (Exception e) {
1163 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1164 responseBuilder.setResponseCode("500");
1165 responseBuilder.setResponseMessage(e.getMessage());
1166 responseBuilder.setAckFinalIndicator("Y");
1167 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1169 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<VnfTopologyOperationOutput>status(true)
1170 .withResult(responseBuilder.build()).build();
1172 return Futures.immediateFuture(rpcResult);
1176 responseBuilder.setResponseCode(responseObject.getStatusCode());
1177 responseBuilder.setAckFinalIndicator(ackFinal);
1178 trySetResponseMessage(responseBuilder, responseObject);
1179 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
1180 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
1182 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<VnfTopologyOperationOutput>status(true)
1183 .withResult(responseBuilder.build()).build();
1186 return Futures.immediateFuture(rpcResult);
1189 private void trySetResponseMessage(VnfTopologyOperationOutputBuilder responseBuilder,
1190 ResponseObject responseObject) {
1191 if (responseObject.getMessage() != null) {
1192 responseBuilder.setResponseMessage(responseObject.getMessage());
1196 private void trySaveService(VnfTopologyOperationInput input, ServiceBuilder serviceBuilder) {
1197 if (isValidRequest(input) && (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete)
1198 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
1200 // Only update operational tree on activate or delete
1201 log.info(UPDATING_TREE_INFO_MESSAGE);
1202 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1206 private boolean hasInvalidVnfId(VnfTopologyOperationInput input) {
1207 return input.getVnfInformation() == null || input.getVnfInformation().getVnfId() == null
1208 || input.getVnfInformation().getVnfId().length() == 0;
1211 private boolean hasInvalidServiceId(VnfTopologyOperationInput input) {
1212 return input == null || input.getServiceInformation() == null
1213 || input.getServiceInformation().getServiceInstanceId() == null
1214 || input.getServiceInformation().getServiceInstanceId().length() == 0;
1217 private void trySetSvcRequestId(VnfTopologyOperationInput input,
1218 VnfTopologyOperationOutputBuilder responseBuilder) {
1219 if (input.getSdncRequestHeader() != null) {
1220 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1224 private boolean isValidRequest(VnfTopologyOperationInput input) {
1225 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
1229 public ListenableFuture<RpcResult<VfModuleTopologyOperationOutput>> vfModuleTopologyOperation(
1230 VfModuleTopologyOperationInput input) {
1232 final String svcOperation = "vf-module-topology-operation";
1233 ServiceData serviceData;
1234 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1235 Properties parms = new Properties();
1237 log.info(CALLED_STR, svcOperation);
1238 // create a new response object
1239 VfModuleTopologyOperationOutputBuilder responseBuilder = new VfModuleTopologyOperationOutputBuilder();
1241 if (hasInvalidServiceId(input)) {
1242 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
1243 responseBuilder.setResponseCode("403");
1244 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
1245 responseBuilder.setAckFinalIndicator("Y");
1247 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1248 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1251 return Futures.immediateFuture(rpcResult);
1254 if (hasInvalidVnfId(input)) {
1255 log.debug("exiting {} because of null or empty vnf-id", svcOperation);
1256 responseBuilder.setResponseCode("403");
1257 responseBuilder.setResponseMessage("invalid input, null or empty vnf-id");
1258 responseBuilder.setAckFinalIndicator("Y");
1259 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1260 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1261 return Futures.immediateFuture(rpcResult);
1264 /*if (hasInvalidVfModuleId(input)) {
1265 log.debug("exiting {} because of null or empty vf-module-id", svcOperation);
1266 responseBuilder.setResponseCode("403");
1267 responseBuilder.setResponseMessage("invalid input, vf-module-id is null or empty");
1268 responseBuilder.setAckFinalIndicator("Y");
1270 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1271 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1273 return Futures.immediateFuture(rpcResult);
1276 // Grab the service instance ID from the input buffer
1277 String siid = input.getServiceInformation().getServiceInstanceId();
1278 String vnfId = input.getVnfInformation().getVnfId();
1279 String vfModuleId = input.getVfModuleInformation().getVfModuleId();
1281 trySetSvcRequestId(input, responseBuilder);
1283 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1284 getServiceData(siid, serviceDataBuilder);
1286 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
1287 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
1289 // Set the serviceStatus based on input
1290 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
1291 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
1294 // setup a service-data object builder
1295 // ACTION vnf-topology-operation
1297 // USES sdnc-request-header;
1298 // USES request-information;
1299 // USES service-information;
1300 // USES vnf-request-information
1302 // USES vnf-topology-response-body;
1303 // USES vnf-information
1304 // USES service-information
1306 // container service-data
1307 // uses vnf-configuration-information;
1308 // uses oper-status;
1310 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
1311 VfModuleTopologyOperationInputBuilder inputBuilder = new VfModuleTopologyOperationInputBuilder(input);
1312 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1314 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
1315 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
1317 // Call SLI sync method
1319 ResponseObject responseObject = new ResponseObject("200", "");
1320 String ackFinal = "Y";
1321 String serviceObjectPath = null;
1322 String vnfObjectPath = null;
1323 String vfModuleObjectPath = null;
1324 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
1326 if (respProps != null) {
1327 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1328 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1329 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1330 if (vfModuleId == null) {
1331 vfModuleId = respProps.getProperty(VF_MODULE_ID_PARAM);
1332 if (vfModuleId == null) {
1333 log.debug("exiting {} because vf-module-id not found in response", svcOperation);
1334 responseBuilder.setResponseCode("403");
1335 responseBuilder.setResponseMessage("failed to generate vf-module-id");
1336 responseBuilder.setAckFinalIndicator("Y");
1338 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1339 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1341 return Futures.immediateFuture(rpcResult);
1344 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1345 vnfObjectPath = respProps.getProperty(VNF_OBJECT_PATH_PARAM);
1346 vfModuleObjectPath = respProps.getProperty(VF_MODULE_OBJECT_PATH_PARAM);
1349 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
1350 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
1351 serviceStatusBuilder.setRpcName(svcOperation);
1353 if (failed(responseObject)) {
1354 responseBuilder.setResponseCode(responseObject.getStatusCode());
1355 responseBuilder.setResponseMessage(responseObject.getMessage());
1356 responseBuilder.setAckFinalIndicator(ackFinal);
1358 ServiceBuilder serviceBuilder = new ServiceBuilder();
1359 serviceBuilder.setServiceInstanceId(siid);
1360 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1362 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
1363 } catch (Exception e) {
1364 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1366 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1368 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1369 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1372 return Futures.immediateFuture(rpcResult);
1375 // Got success from SLI
1377 serviceData = serviceDataBuilder.build();
1378 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
1381 ServiceBuilder serviceBuilder = new ServiceBuilder();
1382 serviceBuilder.setServiceData(serviceData);
1383 serviceBuilder.setServiceInstanceId(siid);
1384 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1385 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1387 trySaveService(input, serviceBuilder);
1389 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1390 serviceResponseInformationBuilder.setInstanceId(siid);
1391 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1392 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1394 VnfResponseInformationBuilder vnfResponseInformationBuilder = new VnfResponseInformationBuilder();
1395 vnfResponseInformationBuilder.setInstanceId(vnfId);
1396 vnfResponseInformationBuilder.setObjectPath(vnfObjectPath);
1397 responseBuilder.setVnfResponseInformation(vnfResponseInformationBuilder.build());
1399 VfModuleResponseInformationBuilder vfModuleResponseInformationBuilder = new VfModuleResponseInformationBuilder();
1400 vfModuleResponseInformationBuilder.setInstanceId(vfModuleId);
1401 vfModuleResponseInformationBuilder.setObjectPath(vfModuleObjectPath);
1402 responseBuilder.setVfModuleResponseInformation(vfModuleResponseInformationBuilder.build());
1404 } catch (Exception e) {
1405 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1406 responseBuilder.setResponseCode("500");
1407 responseBuilder.setResponseMessage(e.getMessage());
1408 responseBuilder.setAckFinalIndicator("Y");
1409 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1411 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1412 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1414 return Futures.immediateFuture(rpcResult);
1418 responseBuilder.setResponseCode(responseObject.getStatusCode());
1419 responseBuilder.setAckFinalIndicator(ackFinal);
1420 trySetResponseMessage(responseBuilder, responseObject);
1421 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
1422 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
1424 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1425 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1428 return Futures.immediateFuture(rpcResult);
1431 private void trySetResponseMessage(VfModuleTopologyOperationOutputBuilder responseBuilder,
1432 ResponseObject responseObject) {
1433 if (responseObject.getMessage() != null) {
1434 responseBuilder.setResponseMessage(responseObject.getMessage());
1438 private void trySaveService(VfModuleTopologyOperationInput input, ServiceBuilder serviceBuilder) {
1439 if (isValidRequest(input) && (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign)
1440 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
1441 // Only update operational tree on activate or delete
1443 log.info(UPDATING_TREE_INFO_MESSAGE);
1444 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1448 private void trySetSvcRequestId(VfModuleTopologyOperationInput input,
1449 VfModuleTopologyOperationOutputBuilder responseBuilder) {
1450 if (input.getSdncRequestHeader() != null) {
1451 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1455 private boolean hasInvalidVfModuleId(VfModuleTopologyOperationInput input) {
1456 return input.getVfModuleInformation() == null || input.getVfModuleInformation().getVfModuleId() == null
1457 || input.getVfModuleInformation().getVfModuleId().length() == 0;
1460 private boolean hasInvalidVnfId(VfModuleTopologyOperationInput input) {
1461 return input.getVnfInformation() == null || input.getVnfInformation().getVnfId() == null
1462 || input.getVnfInformation().getVnfId().length() == 0;
1465 private boolean hasInvalidServiceId(VfModuleTopologyOperationInput input) {
1466 return input == null || input.getServiceInformation() == null
1467 || input.getServiceInformation().getServiceInstanceId() == null
1468 || input.getServiceInformation().getServiceInstanceId().length() == 0;
1471 private boolean isValidRequest(VfModuleTopologyOperationInput input) {
1472 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
1476 public ListenableFuture<RpcResult<NetworkTopologyOperationOutput>> networkTopologyOperation(
1477 NetworkTopologyOperationInput input) {
1479 final String svcOperation = "network-topology-operation";
1480 ServiceData serviceData;
1481 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1482 Properties parms = new Properties();
1484 log.info(CALLED_STR, svcOperation);
1485 // create a new response object
1486 NetworkTopologyOperationOutputBuilder responseBuilder = new NetworkTopologyOperationOutputBuilder();
1488 if (hasInvalidServiceId(input)) {
1489 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
1490 return buildRpcResultFuture(responseBuilder, NULL_OR_EMPTY_ERROR_PARAM);
1493 String siid = input.getServiceInformation().getServiceInstanceId();
1495 // Get the service-instance service data from MD-SAL
1496 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1497 getServiceData(siid, serviceDataBuilder);
1499 this.trySetSvcRequestId(input, responseBuilder);
1501 ServiceData sd = serviceDataBuilder.build();
1502 if (isInvalidServiceData(sd)) {
1503 log.debug(EMPTY_SERVICE_INSTANCE_MESSAGE, svcOperation);
1504 return buildRpcResultFuture(responseBuilder, INVALID_INPUT_ERROR_MESSAGE);
1507 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
1508 NetworkTopologyOperationInputBuilder inputBuilder = new NetworkTopologyOperationInputBuilder(input);
1509 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1511 // Call SLI sync method
1513 ResponseObject responseObject = new ResponseObject("200", "");
1514 String ackFinal = "Y";
1515 String networkId = ERROR_NETWORK_ID;
1516 String serviceObjectPath = null;
1517 String networkObjectPath = null;
1518 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
1520 if (respProps != null) {
1521 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1522 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1523 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1524 networkId = respProps.getProperty("networkId");
1525 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1526 networkObjectPath = respProps.getProperty(NETWORK_OBJECT_PATH_PARAM);
1529 if (failed(responseObject)) {
1530 responseBuilder.setResponseCode(responseObject.getStatusCode());
1531 responseBuilder.setResponseMessage(responseObject.getMessage());
1532 responseBuilder.setAckFinalIndicator(ackFinal);
1534 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1536 RpcResult<NetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
1537 .<NetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1539 return Futures.immediateFuture(rpcResult);
1542 // Got success from SLI
1545 serviceData = serviceDataBuilder.build();
1546 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
1549 ServiceBuilder serviceBuilder = new ServiceBuilder();
1550 serviceBuilder.setServiceData(serviceData);
1551 serviceBuilder.setServiceInstanceId(siid);
1552 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1553 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1555 trySaveService(input, serviceBuilder);
1557 NetworkResponseInformationBuilder networkResponseInformationBuilder = new NetworkResponseInformationBuilder();
1558 networkResponseInformationBuilder.setInstanceId(networkId);
1559 networkResponseInformationBuilder.setObjectPath(networkObjectPath);
1560 responseBuilder.setNetworkResponseInformation(networkResponseInformationBuilder.build());
1562 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1563 serviceResponseInformationBuilder.setInstanceId(siid);
1564 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1565 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1567 } catch (IllegalStateException e) {
1568 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1569 responseBuilder.setResponseCode("500");
1570 responseBuilder.setResponseMessage(e.getMessage());
1571 responseBuilder.setAckFinalIndicator("Y");
1572 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1574 RpcResult<NetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
1575 .<NetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1577 return Futures.immediateFuture(rpcResult);
1581 responseBuilder.setResponseCode(responseObject.getStatusCode());
1582 responseBuilder.setAckFinalIndicator(ackFinal);
1583 trySetResponseMessage(responseBuilder, responseObject);
1584 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
1585 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
1587 RpcResult<NetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
1588 .<NetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1590 return Futures.immediateFuture(rpcResult);
1593 private void trySetResponseMessage(NetworkTopologyOperationOutputBuilder responseBuilder,
1594 ResponseObject responseObject) {
1595 if (responseObject.getMessage() != null) {
1596 responseBuilder.setResponseMessage(responseObject.getMessage());
1600 private void trySetSvcRequestId(NetworkTopologyOperationInput input,
1601 NetworkTopologyOperationOutputBuilder responseBuilder) {
1602 if (input.getSdncRequestHeader() != null) {
1603 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1607 private void trySaveService(NetworkTopologyOperationInput input, ServiceBuilder serviceBuilder) {
1608 if (isValidRequest(input) && (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)
1609 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Create))) {
1610 // Only update operational tree on Activate
1611 log.info(UPDATING_TREE_INFO_MESSAGE);
1612 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1616 private boolean hasInvalidServiceId(NetworkTopologyOperationInput input) {
1617 return input == null || input.getServiceInformation() == null
1618 || input.getServiceInformation().getServiceInstanceId() == null
1619 || input.getServiceInformation().getServiceInstanceId().length() == 0;
1622 private ListenableFuture<RpcResult<NetworkTopologyOperationOutput>> buildRpcResultFuture(
1623 NetworkTopologyOperationOutputBuilder responseBuilder, String responseMessage) {
1625 responseBuilder.setResponseCode("404");
1626 responseBuilder.setResponseMessage(responseMessage);
1627 responseBuilder.setAckFinalIndicator("Y");
1629 RpcResult<NetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
1630 .<NetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1632 return Futures.immediateFuture(rpcResult);
1635 private boolean isValidRequest(NetworkTopologyOperationInput input) {
1636 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
1640 public ListenableFuture<RpcResult<ContrailRouteTopologyOperationOutput>> contrailRouteTopologyOperation(
1641 ContrailRouteTopologyOperationInput input) {
1643 final String svcOperation = "contrail-route-topology-operation";
1644 ServiceData serviceData;
1645 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1646 Properties properties = new Properties();
1648 log.info(CALLED_STR, svcOperation);
1649 // create a new response object
1650 ContrailRouteTopologyOperationOutputBuilder responseBuilder = new ContrailRouteTopologyOperationOutputBuilder();
1652 if (hasInvalidServiceId(input)) {
1653 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
1654 return buildRpcResultFuture(responseBuilder, NULL_OR_EMPTY_ERROR_PARAM);
1657 String siid = input.getServiceInformation().getServiceInstanceId();
1659 // Get the service-instance service data from MD-SAL
1660 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1661 getServiceData(siid, serviceDataBuilder);
1663 trySetSvcRequestId(input, responseBuilder);
1665 ServiceData sd = serviceDataBuilder.build();
1666 if (isInvalidServiceData(sd)) {
1667 log.debug(EMPTY_SERVICE_INSTANCE_MESSAGE, svcOperation);
1668 return buildRpcResultFuture(responseBuilder, INVALID_INPUT_ERROR_MESSAGE);
1671 log.info("Adding INPUT data for " + svcOperation + " [" + siid + "] input: " + input);
1672 ContrailRouteTopologyOperationInputBuilder inputBuilder = new ContrailRouteTopologyOperationInputBuilder(input);
1673 GenericResourceApiUtil.toProperties(properties, inputBuilder.build());
1675 // Call SLI sync method
1677 ResponseObject responseObject = new ResponseObject("200", "");
1678 String ackFinal = "Y";
1679 String allottedResourceId = ERROR_NETWORK_ID;
1680 String serviceObjectPath = null;
1681 String contrailRouteObjectPath = null;
1682 Properties respProps = tryGetProperties(svcOperation, properties, serviceDataBuilder, responseObject);
1684 if (respProps != null) {
1685 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1686 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1687 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1688 allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
1689 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1690 contrailRouteObjectPath = respProps.getProperty("contrail-route-object-path");
1693 if (failed(responseObject)) {
1694 responseBuilder.setResponseCode(responseObject.getStatusCode());
1695 responseBuilder.setResponseMessage(responseObject.getMessage());
1696 responseBuilder.setAckFinalIndicator(ackFinal);
1697 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1699 RpcResult<ContrailRouteTopologyOperationOutput> rpcResult = RpcResultBuilder
1700 .<ContrailRouteTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1702 return Futures.immediateFuture(rpcResult);
1705 // Got success from SLI
1707 serviceData = serviceDataBuilder.build();
1708 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
1711 ServiceBuilder serviceBuilder = new ServiceBuilder();
1712 serviceBuilder.setServiceData(serviceData);
1713 serviceBuilder.setServiceInstanceId(siid);
1714 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1715 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1717 trySaveService(input, serviceBuilder);
1719 ContrailRouteResponseInformationBuilder contrailRouteResponseInformationBuilder = new ContrailRouteResponseInformationBuilder();
1720 contrailRouteResponseInformationBuilder.setInstanceId(allottedResourceId);
1721 contrailRouteResponseInformationBuilder.setObjectPath(contrailRouteObjectPath);
1722 responseBuilder.setContrailRouteResponseInformation(contrailRouteResponseInformationBuilder.build());
1724 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1725 serviceResponseInformationBuilder.setInstanceId(siid);
1726 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1727 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1729 } catch (IllegalStateException e) {
1730 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1731 responseBuilder.setResponseCode("500");
1732 responseBuilder.setResponseMessage(e.getMessage());
1733 responseBuilder.setAckFinalIndicator("Y");
1734 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1736 RpcResult<ContrailRouteTopologyOperationOutput> rpcResult = RpcResultBuilder
1737 .<ContrailRouteTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1739 return Futures.immediateFuture(rpcResult);
1743 responseBuilder.setResponseCode(responseObject.getStatusCode());
1744 responseBuilder.setAckFinalIndicator(ackFinal);
1745 trySetResponseMessage(responseBuilder, responseObject);
1746 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
1747 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
1749 RpcResult<ContrailRouteTopologyOperationOutput> rpcResult = RpcResultBuilder
1750 .<ContrailRouteTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1752 return Futures.immediateFuture(rpcResult);
1755 private void trySetResponseMessage(ContrailRouteTopologyOperationOutputBuilder responseBuilder,
1756 ResponseObject responseObject) {
1757 if (responseObject.getMessage() != null) {
1758 responseBuilder.setResponseMessage(responseObject.getMessage());
1762 private void trySaveService(ContrailRouteTopologyOperationInput input, ServiceBuilder serviceBuilder) {
1763 if (isValidRequest(input) && (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign)
1764 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
1765 // Only update operational tree on activate or delete
1766 log.info(UPDATING_TREE_INFO_MESSAGE);
1767 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1771 private void trySetSvcRequestId(ContrailRouteTopologyOperationInput input,
1772 ContrailRouteTopologyOperationOutputBuilder responseBuilder) {
1773 if (input.getSdncRequestHeader() != null) {
1774 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1778 private boolean hasInvalidServiceId(ContrailRouteTopologyOperationInput input) {
1779 return input == null || input.getServiceInformation() == null
1780 || input.getServiceInformation().getServiceInstanceId() == null
1781 || input.getServiceInformation().getServiceInstanceId().length() == 0;
1784 private ListenableFuture<RpcResult<ContrailRouteTopologyOperationOutput>> buildRpcResultFuture(
1785 ContrailRouteTopologyOperationOutputBuilder responseBuilder, String responseMessage) {
1786 responseBuilder.setResponseCode("404");
1787 responseBuilder.setResponseMessage(responseMessage);
1788 responseBuilder.setAckFinalIndicator("Y");
1790 RpcResult<ContrailRouteTopologyOperationOutput> rpcResult = RpcResultBuilder
1791 .<ContrailRouteTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1793 return Futures.immediateFuture(rpcResult);
1796 private boolean isValidRequest(ContrailRouteTopologyOperationInput input) {
1797 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
1801 public ListenableFuture<RpcResult<SecurityZoneTopologyOperationOutput>> securityZoneTopologyOperation(
1802 SecurityZoneTopologyOperationInput input) {
1804 final String svcOperation = "security-zone-topology-operation";
1805 ServiceData serviceData;
1806 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1807 Properties parms = new Properties();
1809 log.info(CALLED_STR, svcOperation);
1810 // create a new response object
1811 SecurityZoneTopologyOperationOutputBuilder responseBuilder = new SecurityZoneTopologyOperationOutputBuilder();
1813 if (this.hasInvalidServiceId(input)) {
1814 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
1815 return buildRpcResultFuture(responseBuilder, NULL_OR_EMPTY_ERROR_PARAM);
1818 String siid = input.getServiceInformation().getServiceInstanceId();
1820 // Get the service-instance service data from MD-SAL
1821 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1822 getServiceData(siid, serviceDataBuilder);
1823 trySetSvcRequestId(input, responseBuilder);
1825 ServiceData sd = serviceDataBuilder.build();
1826 if (isInvalidServiceData(sd)) {
1827 log.debug(EMPTY_SERVICE_INSTANCE_MESSAGE, svcOperation);
1828 return buildRpcResultFuture(responseBuilder, INVALID_INPUT_ERROR_MESSAGE);
1831 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
1832 SecurityZoneTopologyOperationInputBuilder inputBuilder = new SecurityZoneTopologyOperationInputBuilder(input);
1833 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1835 // Call SLI sync method
1837 Properties respProps = null;
1839 ResponseObject responseObject = new ResponseObject("200", "");
1840 String ackFinal = "Y";
1841 String allottedResourceId = ERROR_NETWORK_ID;
1842 String serviceObjectPath = null;
1843 String securityZoneObjectPath = null;
1846 if (svcLogicClient.hasGraph(APP_NAME, svcOperation, null, "sync")) {
1849 respProps = svcLogicClient.execute(APP_NAME, svcOperation, null, "sync", serviceDataBuilder, parms);
1850 } catch (Exception e) {
1851 log.error(SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE, svcOperation, e);
1852 responseObject.setMessage(e.getMessage());
1853 responseObject.setStatusCode("500");
1856 responseObject.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
1857 responseObject.setStatusCode("503");
1859 } catch (Exception e) {
1860 responseObject.setStatusCode("500");
1861 responseObject.setMessage(e.getMessage());
1862 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
1865 if (respProps != null) {
1866 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1867 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1868 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1869 allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
1870 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1871 securityZoneObjectPath = respProps.getProperty("security-zone-object-path");
1874 if (failed(responseObject)) {
1875 responseBuilder.setResponseCode(responseObject.getStatusCode());
1876 responseBuilder.setResponseMessage(responseObject.getMessage());
1877 responseBuilder.setAckFinalIndicator(ackFinal);
1878 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1880 RpcResult<SecurityZoneTopologyOperationOutput> rpcResult = RpcResultBuilder
1881 .<SecurityZoneTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1883 return Futures.immediateFuture(rpcResult);
1886 // Got success from SLI
1889 serviceData = serviceDataBuilder.build();
1890 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
1893 ServiceBuilder serviceBuilder = new ServiceBuilder();
1894 serviceBuilder.setServiceData(serviceData);
1895 serviceBuilder.setServiceInstanceId(siid);
1896 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1897 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1899 trySaveService(input, serviceBuilder);
1901 SecurityZoneResponseInformationBuilder securityZoneResponseInformationBuilder = new SecurityZoneResponseInformationBuilder();
1902 securityZoneResponseInformationBuilder.setInstanceId(allottedResourceId);
1903 securityZoneResponseInformationBuilder.setObjectPath(securityZoneObjectPath);
1904 responseBuilder.setSecurityZoneResponseInformation(securityZoneResponseInformationBuilder.build());
1906 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1907 serviceResponseInformationBuilder.setInstanceId(siid);
1908 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1909 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1911 } catch (IllegalStateException e) {
1912 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1913 responseBuilder.setResponseCode("500");
1914 responseBuilder.setResponseMessage(e.getMessage());
1915 responseBuilder.setAckFinalIndicator("Y");
1916 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1918 RpcResult<SecurityZoneTopologyOperationOutput> rpcResult = RpcResultBuilder
1919 .<SecurityZoneTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1921 return Futures.immediateFuture(rpcResult);
1925 responseBuilder.setResponseCode(responseObject.getStatusCode());
1926 responseBuilder.setAckFinalIndicator(ackFinal);
1927 trySetResponseMessage(responseBuilder, responseObject);
1928 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
1929 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
1931 RpcResult<SecurityZoneTopologyOperationOutput> rpcResult = RpcResultBuilder
1932 .<SecurityZoneTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1934 return Futures.immediateFuture(rpcResult);
1937 private void trySetResponseMessage(SecurityZoneTopologyOperationOutputBuilder responseBuilder,
1938 ResponseObject responseObject) {
1939 if (responseObject.getMessage() != null) {
1940 responseBuilder.setResponseMessage(responseObject.getMessage());
1944 private void trySaveService(SecurityZoneTopologyOperationInput input, ServiceBuilder serviceBuilder) {
1945 if (isValidRequest(input) && (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign)
1946 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
1947 // Only update operational tree on activate or delete
1948 log.info(UPDATING_TREE_INFO_MESSAGE);
1949 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1953 private void trySetSvcRequestId(SecurityZoneTopologyOperationInput input,
1954 SecurityZoneTopologyOperationOutputBuilder responseBuilder) {
1955 if (input.getSdncRequestHeader() != null) {
1956 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1960 private boolean isInvalidServiceData(ServiceData sd) {
1961 return sd == null || sd.getServiceLevelOperStatus() == null;
1964 private boolean hasInvalidServiceId(SecurityZoneTopologyOperationInput input) {
1965 return input == null || input.getServiceInformation() == null
1966 || input.getServiceInformation().getServiceInstanceId() == null
1967 || input.getServiceInformation().getServiceInstanceId().length() == 0;
1970 private ListenableFuture<RpcResult<SecurityZoneTopologyOperationOutput>> buildRpcResultFuture(
1971 SecurityZoneTopologyOperationOutputBuilder responseBuilder, String responseMessage) {
1973 responseBuilder.setResponseCode("404");
1974 responseBuilder.setResponseMessage(responseMessage);
1975 responseBuilder.setAckFinalIndicator("Y");
1977 RpcResult<SecurityZoneTopologyOperationOutput> rpcResult = RpcResultBuilder
1978 .<SecurityZoneTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1980 return Futures.immediateFuture(rpcResult);
1983 private boolean isValidRequest(SecurityZoneTopologyOperationInput input) {
1984 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
1988 private boolean hasInvalidServiceId(ConnectionAttachmentTopologyOperationInput input) {
1989 return input == null || input.getServiceInformation() == null
1990 || input.getServiceInformation().getServiceInstanceId() == null
1991 || input.getServiceInformation().getServiceInstanceId().length() == 0;
1994 private void trySetResponseMessage(ConnectionAttachmentTopologyOperationOutputBuilder responseBuilder,
1995 ResponseObject error) {
1996 if (!error.getMessage().isEmpty()) {
1997 responseBuilder.setResponseMessage(error.getMessage());
2001 private void trySetSvcRequestId(ConnectionAttachmentTopologyOperationInput input,
2002 ConnectionAttachmentTopologyOperationOutputBuilder responseBuilder) {
2003 if (input.getSdncRequestHeader() != null) {
2004 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
2008 private ListenableFuture<RpcResult<ConnectionAttachmentTopologyOperationOutput>>
2009 buildRpcResultFuture(ConnectionAttachmentTopologyOperationOutputBuilder responseBuilder, String responseMessage) {
2011 responseBuilder.setResponseCode("404");
2012 responseBuilder.setResponseMessage(responseMessage);
2013 responseBuilder.setAckFinalIndicator("Y");
2015 RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
2016 .<ConnectionAttachmentTopologyOperationOutput>status(true)
2017 .withResult(responseBuilder.build())
2020 return Futures.immediateFuture(rpcResult);
2023 private void trySaveService(ConnectionAttachmentTopologyOperationInput input, ServiceBuilder serviceBuilder) {
2024 if (isValidRequest(input) &&
2025 (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign) ||
2026 input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
2027 // Only update operational tree on activate or delete
2028 log.info(UPDATING_TREE_INFO_MESSAGE);
2029 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
2033 private boolean isValidRequest(ConnectionAttachmentTopologyOperationInput input) {
2034 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
2038 public ListenableFuture<RpcResult<ConnectionAttachmentTopologyOperationOutput>> connectionAttachmentTopologyOperation(ConnectionAttachmentTopologyOperationInput input) {
2039 final String svcOperation = "connection-attachment-topology-operation";
2040 Properties parms = new Properties();
2041 log.info(CALLED_STR, svcOperation);
2043 // create a new response object
2044 ConnectionAttachmentTopologyOperationOutputBuilder responseBuilder = new ConnectionAttachmentTopologyOperationOutputBuilder();
2045 if (hasInvalidServiceId(input)) {
2046 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
2047 responseBuilder.setResponseCode("404");
2048 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
2049 responseBuilder.setAckFinalIndicator("Y");
2051 RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
2052 .<ConnectionAttachmentTopologyOperationOutput>status(true)
2053 .withResult(responseBuilder.build())
2056 return Futures.immediateFuture(rpcResult);
2059 ServiceData serviceData;
2060 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
2062 String siid = input.getServiceInformation().getServiceInstanceId();
2063 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
2065 // Get the service-instance service data from MD-SAL
2066 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
2067 getServiceData(siid, serviceDataBuilder);
2069 trySetSvcRequestId(input, responseBuilder);
2071 ServiceData sd = serviceDataBuilder.build();
2072 if (isInvalidServiceData(sd)) {
2073 log.debug(EMPTY_SERVICE_INSTANCE_MESSAGE, svcOperation);
2074 return buildRpcResultFuture(responseBuilder, INVALID_INPUT_ERROR_MESSAGE);
2077 ConnectionAttachmentTopologyOperationInputBuilder inputBuilder = new ConnectionAttachmentTopologyOperationInputBuilder(input);
2078 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
2080 // Call SLI sync method
2081 // Get SvcLogicService reference
2082 ResponseObject responseObject = new ResponseObject("200", "");
2083 String ackFinal = "Y";
2084 String allottedResourceId = ERROR_NETWORK_ID;
2085 String serviceObjectPath = null;
2086 String connectionAttachmentObjectPath = null;
2088 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
2090 if (respProps != null) {
2091 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2092 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2093 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2094 allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
2095 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
2096 connectionAttachmentObjectPath = respProps.getProperty("connection-attachment-object-path");
2099 if (failed(responseObject)) {
2100 responseBuilder.setResponseCode(responseObject.getStatusCode());
2101 responseBuilder.setResponseMessage(responseObject.getMessage());
2102 responseBuilder.setAckFinalIndicator(ackFinal);
2104 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2106 RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
2107 .<ConnectionAttachmentTopologyOperationOutput>status(true)
2108 .withResult(responseBuilder.build())
2111 return Futures.immediateFuture(rpcResult);
2114 // Got success from SLI
2117 serviceData = serviceDataBuilder.build();
2118 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
2121 ServiceBuilder serviceBuilder = new ServiceBuilder();
2122 serviceBuilder.setServiceData(serviceData);
2123 serviceBuilder.setServiceInstanceId(siid);
2124 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
2125 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
2127 trySaveService(input, serviceBuilder);
2129 ConnectionAttachmentResponseInformationBuilder connectionAttachmentResponseInformationBuilder = new ConnectionAttachmentResponseInformationBuilder();
2130 connectionAttachmentResponseInformationBuilder.setInstanceId(allottedResourceId);
2131 connectionAttachmentResponseInformationBuilder.setObjectPath(connectionAttachmentObjectPath);
2132 responseBuilder.setConnectionAttachmentResponseInformation(connectionAttachmentResponseInformationBuilder.build());
2134 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
2135 serviceResponseInformationBuilder.setInstanceId(siid);
2136 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
2137 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
2139 } catch (IllegalStateException e) {
2140 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
2141 responseBuilder.setResponseCode("500");
2142 responseBuilder.setResponseMessage(e.getMessage());
2143 responseBuilder.setAckFinalIndicator("Y");
2144 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2146 RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
2147 .<ConnectionAttachmentTopologyOperationOutput>status(true)
2148 .withResult(responseBuilder.build())
2151 return Futures.immediateFuture(rpcResult);
2155 responseBuilder.setResponseCode(responseObject.getStatusCode());
2156 responseBuilder.setAckFinalIndicator(ackFinal);
2157 trySetResponseMessage(responseBuilder, responseObject);
2158 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
2159 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
2161 RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
2162 .<ConnectionAttachmentTopologyOperationOutput>status(true)
2163 .withResult(responseBuilder.build())
2166 return Futures.immediateFuture(rpcResult);
2170 public ListenableFuture<RpcResult<TunnelxconnTopologyOperationOutput>> tunnelxconnTopologyOperation(
2171 TunnelxconnTopologyOperationInput input) {
2173 final String svcOperation = "tunnelxconn-topology-operation";
2174 Properties parms = new Properties();
2175 log.info(CALLED_STR, svcOperation);
2177 // create a new response object
2178 TunnelxconnTopologyOperationOutputBuilder responseBuilder = new TunnelxconnTopologyOperationOutputBuilder();
2179 if (hasInvalidServiceId(input)) {
2180 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
2181 responseBuilder.setResponseCode("404");
2182 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
2183 responseBuilder.setAckFinalIndicator("Y");
2185 RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
2186 .<TunnelxconnTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2188 return Futures.immediateFuture(rpcResult);
2190 String siid = input.getServiceInformation().getServiceInstanceId();
2191 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
2192 TunnelxconnTopologyOperationInputBuilder inputBuilder = new TunnelxconnTopologyOperationInputBuilder(input);
2193 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
2195 // Call SLI sync method
2197 ResponseObject responseObject = new ResponseObject("200", "");
2198 String ackFinal = "Y";
2199 String allottedResourceId = ERROR_NETWORK_ID;
2200 String serviceObjectPath = null;
2201 String tunnelxconnObjectPath = null;
2202 Properties respProps = tryGetProperties(svcOperation, parms, responseObject);
2204 if (respProps != null) {
2205 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2206 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2207 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2208 allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
2209 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
2210 tunnelxconnObjectPath = respProps.getProperty("tunnelxconn-object-path");
2213 if (failed(responseObject)) {
2214 responseBuilder.setResponseCode(responseObject.getStatusCode());
2215 responseBuilder.setResponseMessage(responseObject.getMessage());
2216 responseBuilder.setAckFinalIndicator(ackFinal);
2218 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2220 RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
2221 .<TunnelxconnTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2223 return Futures.immediateFuture(rpcResult);
2226 // Got success from SLI
2228 TunnelxconnResponseInformationBuilder tunnelxconnResponseInformationBuilder = new TunnelxconnResponseInformationBuilder();
2229 tunnelxconnResponseInformationBuilder.setInstanceId(allottedResourceId);
2230 tunnelxconnResponseInformationBuilder.setObjectPath(tunnelxconnObjectPath);
2231 responseBuilder.setTunnelxconnResponseInformation(tunnelxconnResponseInformationBuilder.build());
2233 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
2234 serviceResponseInformationBuilder.setInstanceId(siid);
2235 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
2236 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
2238 } catch (IllegalStateException e) {
2239 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
2240 responseBuilder.setResponseCode("500");
2241 responseBuilder.setResponseMessage(e.getMessage());
2242 responseBuilder.setAckFinalIndicator("Y");
2243 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2245 RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
2246 .<TunnelxconnTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2248 return Futures.immediateFuture(rpcResult);
2252 responseBuilder.setResponseCode(responseObject.getStatusCode());
2253 responseBuilder.setAckFinalIndicator(ackFinal);
2254 trySetResponseMessage(responseBuilder, responseObject);
2255 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
2256 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
2258 RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
2259 .<TunnelxconnTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2261 return Futures.immediateFuture(rpcResult);
2264 private void trySetResponseMessage(TunnelxconnTopologyOperationOutputBuilder responseBuilder,
2265 ResponseObject responseObject) {
2266 if (responseObject.getMessage() != null) {
2267 responseBuilder.setResponseMessage(responseObject.getMessage());
2271 private boolean hasInvalidServiceId(TunnelxconnTopologyOperationInput input) {
2272 return input == null || input.getServiceInformation() == null
2273 || input.getServiceInformation().getServiceInstanceId() == null
2274 || input.getServiceInformation().getServiceInstanceId().length() == 0;
2277 private Properties tryGetProperties(String svcOperation, Properties parms, ResponseObject responseObject) {
2279 if (svcLogicClient.hasGraph(APP_NAME, svcOperation, null, "sync")) {
2282 return svcLogicClient.execute(APP_NAME, svcOperation, null, "sync", parms);
2283 } catch (Exception e) {
2284 log.error(SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE, svcOperation, e);
2285 responseObject.setMessage(e.getMessage());
2286 responseObject.setStatusCode("500");
2289 responseObject.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
2290 responseObject.setStatusCode("503");
2292 } catch (Exception e) {
2293 responseObject.setMessage(e.getMessage());
2294 responseObject.setStatusCode("500");
2295 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
2301 public ListenableFuture<RpcResult<BrgTopologyOperationOutput>> brgTopologyOperation(BrgTopologyOperationInput input) {
2302 final String svcOperation = "brg-topology-operation";
2303 Properties parms = new Properties();
2305 log.info(CALLED_STR, svcOperation);
2306 // create a new response object
2307 BrgTopologyOperationOutputBuilder responseBuilder = new BrgTopologyOperationOutputBuilder();
2309 if (this.hasInvalidServiceId(input)) {
2311 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
2312 responseBuilder.setResponseCode("404");
2313 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
2314 responseBuilder.setAckFinalIndicator("Y");
2316 RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder.<BrgTopologyOperationOutput>status(true)
2317 .withResult(responseBuilder.build()).build();
2319 return Futures.immediateFuture(rpcResult);
2322 String siid = input.getServiceInformation().getServiceInstanceId();
2324 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
2325 BrgTopologyOperationInputBuilder inputBuilder = new BrgTopologyOperationInputBuilder(input);
2326 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
2328 // Call SLI sync method
2330 ResponseObject responseObject = new ResponseObject("200", "");
2331 String ackFinal = "Y";
2332 String allottedResourceId = ERROR_NETWORK_ID;
2333 String serviceObjectPath = null;
2334 String brgObjectPath = null;
2335 Properties respProps = tryGetProperties(svcOperation, parms, responseObject);
2337 if (respProps != null) {
2338 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2339 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2340 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2341 allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
2342 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
2343 brgObjectPath = respProps.getProperty("brg-object-path");
2346 if (failed(responseObject)) {
2347 responseBuilder.setResponseCode(responseObject.getStatusCode());
2348 responseBuilder.setResponseMessage(responseObject.getMessage());
2349 responseBuilder.setAckFinalIndicator(ackFinal);
2351 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2352 RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder.<BrgTopologyOperationOutput>status(true)
2353 .withResult(responseBuilder.build()).build();
2355 return Futures.immediateFuture(rpcResult);
2358 // Got success from SLI
2361 BrgResponseInformationBuilder brgResponseInformationBuilder = new BrgResponseInformationBuilder();
2362 brgResponseInformationBuilder.setInstanceId(allottedResourceId);
2363 brgResponseInformationBuilder.setObjectPath(brgObjectPath);
2364 responseBuilder.setBrgResponseInformation(brgResponseInformationBuilder.build());
2366 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
2367 serviceResponseInformationBuilder.setInstanceId(siid);
2368 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
2369 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
2371 } catch (IllegalStateException e) {
2372 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
2373 responseBuilder.setResponseCode("500");
2374 responseBuilder.setResponseMessage(e.getMessage());
2375 responseBuilder.setAckFinalIndicator("Y");
2376 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2378 RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder.<BrgTopologyOperationOutput>status(true)
2379 .withResult(responseBuilder.build()).build();
2381 return Futures.immediateFuture(rpcResult);
2385 responseBuilder.setResponseCode(responseObject.getStatusCode());
2386 responseBuilder.setAckFinalIndicator(ackFinal);
2387 trySetResponseMessage(responseBuilder, responseObject);
2388 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
2389 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
2391 RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder.<BrgTopologyOperationOutput>status(true)
2392 .withResult(responseBuilder.build()).build();
2394 return Futures.immediateFuture(rpcResult);
2397 private void trySetResponseMessage(BrgTopologyOperationOutputBuilder responseBuilder,
2398 ResponseObject responseObject) {
2399 if (responseObject.getMessage() != null) {
2400 responseBuilder.setResponseMessage(responseObject.getMessage());
2404 private boolean hasInvalidServiceId(BrgTopologyOperationInput input) {
2405 return input == null || input.getServiceInformation() == null
2406 || input.getServiceInformation().getServiceInstanceId() == null
2407 || input.getServiceInformation().getServiceInstanceId().length() == 0;
2410 private String resolveAckFinal(ResponseObject responseObject, Properties respProps) {
2411 if (respProps != null) {
2412 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2413 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2414 return respProps.getProperty(ACK_FINAL_PARAM, "Y");
2420 public ListenableFuture<RpcResult<PreloadNetworkTopologyOperationOutput>> preloadNetworkTopologyOperation(
2421 PreloadNetworkTopologyOperationInput input) {
2423 final String svcOperation = "preload-network-topology-operation";
2424 PreloadData preloadData;
2425 Properties properties = new Properties();
2427 log.info(CALLED_STR, svcOperation);
2428 // create a new response object
2429 PreloadNetworkTopologyOperationOutputBuilder responseBuilder = new PreloadNetworkTopologyOperationOutputBuilder();
2431 if (hasInvalidPreloadNetwork(input)) {
2432 log.debug("exiting {} because of null or empty preload-network-topology-information", svcOperation);
2433 responseBuilder.setResponseCode("403");
2434 responseBuilder.setResponseMessage("invalid input, null or empty preload-network-topology-information");
2435 responseBuilder.setAckFinalIndicator("Y");
2437 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2438 .<PreloadNetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2440 return Futures.immediateFuture(rpcResult);
2443 // Grab the preload ID from the input buffer
2444 String preloadId = input.getPreloadNetworkTopologyInformation().getNetworkTopologyIdentifierStructure()
2446 String preloadType = "network";
2448 trySetSvcRequestId(input, responseBuilder);
2450 PreloadDataBuilder preloadDataBuilder = new PreloadDataBuilder();
2451 getPreloadData(preloadId, preloadType, preloadDataBuilder);
2453 PreloadDataBuilder operDataBuilder = new PreloadDataBuilder();
2454 getPreloadData(preloadId, preloadType, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
2457 // setup a preload-data object builder
2458 // ACTION preload-network-topology-operation
2460 // uses sdnc-request-header;
2461 // uses request-information;
2462 // uses preload-network-topology-information;
2464 // uses preload-topology-response-body;
2466 // container preload-data
2467 // uses preload-network-topology-information;
2468 // uses preload-oper-status;
2470 log.info(ADDING_INPUT_DATA_LOG, svcOperation, preloadId, input);
2471 PreloadNetworkTopologyOperationInputBuilder inputBuilder = new PreloadNetworkTopologyOperationInputBuilder(
2473 GenericResourceApiUtil.toProperties(properties, inputBuilder.build());
2474 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, preloadId, input);
2475 GenericResourceApiUtil.toProperties(properties, OPERATIONAL_DATA_PARAM, operDataBuilder);
2477 // Call SLI sync method
2478 ResponseObject responseObject = new ResponseObject("200", "");
2479 String ackFinal = "Y";
2480 Properties respProps = tryGetProperties(svcOperation, properties, preloadDataBuilder, responseObject);
2482 if (respProps != null) {
2483 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2484 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2485 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2488 if (failed(responseObject)) {
2489 responseBuilder.setResponseCode(responseObject.getStatusCode());
2490 responseBuilder.setResponseMessage(responseObject.getMessage());
2491 responseBuilder.setAckFinalIndicator(ackFinal);
2492 log.error(RETURNED_FAILED_MESSAGE, svcOperation, preloadId, responseBuilder.build());
2493 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2494 .<PreloadNetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2495 return Futures.immediateFuture(rpcResult);
2498 // Got success from SLI
2500 preloadData = preloadDataBuilder.build();
2501 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, preloadId, preloadData);
2503 // preload-list object
2504 PreloadListBuilder preloadListBuilder = new PreloadListBuilder();
2505 preloadListBuilder.setPreloadId(preloadId);
2506 preloadListBuilder.setPreloadType(preloadType);
2507 preloadListBuilder.setPreloadData(preloadData);
2509 savePreloadList(preloadListBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
2510 log.info(UPDATING_TREE_INFO_MESSAGE);
2511 savePreloadList(preloadListBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
2513 tryDeletePreload(input, preloadListBuilder);
2514 } catch (Exception e) {
2515 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, preloadId, e);
2516 responseBuilder.setResponseCode("500");
2517 responseBuilder.setResponseMessage(e.getMessage());
2518 responseBuilder.setAckFinalIndicator("Y");
2519 log.error(RETURNED_FAILED_MESSAGE, svcOperation, preloadId, responseBuilder.build());
2520 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2521 .<PreloadNetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2522 return Futures.immediateFuture(rpcResult);
2526 responseBuilder.setResponseCode(responseObject.getStatusCode());
2527 responseBuilder.setAckFinalIndicator(ackFinal);
2528 trySetResponseMessage(responseBuilder, responseObject);
2529 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, preloadId);
2530 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, preloadId, responseBuilder.build());
2532 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2533 .<PreloadNetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2534 return Futures.immediateFuture(rpcResult);
2537 private boolean hasInvalidPreloadNetwork(PreloadNetworkTopologyOperationInput input) {
2538 return input == null || input.getPreloadNetworkTopologyInformation() == null
2539 || input.getPreloadNetworkTopologyInformation().getNetworkTopologyIdentifierStructure() == null;
2542 private boolean hasInvalidPreloadId(String preloadId) {
2543 return preloadId == null || preloadId.length() == 0;
2546 private void trySetSvcRequestId(PreloadNetworkTopologyOperationInput input,
2547 PreloadNetworkTopologyOperationOutputBuilder responseBuilder) {
2548 if (input.getSdncRequestHeader() != null) {
2549 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
2553 private Properties tryGetProperties(String svcOperation, Properties parms, PreloadDataBuilder preloadDataBuilder,
2554 ResponseObject responseObject) {
2556 if (svcLogicClient.hasGraph(APP_NAME, svcOperation, null, "sync")) {
2558 return svcLogicClient.execute(APP_NAME, svcOperation, null, "sync", preloadDataBuilder, parms);
2559 } catch (Exception e) {
2560 log.error(SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE, svcOperation, e);
2561 responseObject.setMessage(e.getMessage());
2562 responseObject.setStatusCode("500");
2565 responseObject.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
2566 responseObject.setStatusCode("503");
2568 } catch (Exception e) {
2569 responseObject.setMessage(e.getMessage());
2570 responseObject.setStatusCode("500");
2571 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
2577 private void trySetResponseMessage(PreloadNetworkTopologyOperationOutputBuilder responseBuilder,
2578 ResponseObject responseObject) {
2579 if (responseObject.getMessage() != null) {
2580 if (!responseObject.getMessage().isEmpty()) {
2581 responseBuilder.setResponseMessage(responseObject.getMessage());
2586 private void tryDeletePreload(PreloadNetworkTopologyOperationInput input, PreloadListBuilder preloadListBuilder) {
2587 if (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete)) {
2588 log.info("Delete from both CONFIGURATION and OPERATIONAL tree.");
2589 deletePreloadList(preloadListBuilder.build(), LogicalDatastoreType.OPERATIONAL);
2590 deletePreloadList(preloadListBuilder.build(), LogicalDatastoreType.CONFIGURATION);
2595 public ListenableFuture<RpcResult<PreloadVfModuleTopologyOperationOutput>> preloadVfModuleTopologyOperation(
2596 PreloadVfModuleTopologyOperationInput input) {
2598 final String svcOperation = "preload-vf-module-topology-operation";
2599 PreloadData preloadData;
2600 Properties properties = new Properties();
2602 log.info(CALLED_STR, svcOperation);
2603 // create a new response object
2604 PreloadVfModuleTopologyOperationOutputBuilder responseBuilder = new PreloadVfModuleTopologyOperationOutputBuilder();
2606 if (hasInvalidPreloadVfModule(input)) {
2608 "exiting {} because of null or empty preload-vf-module-topology-information.vf-module-topology.vf-module-topology-identifier.vf-module-name",
2610 responseBuilder.setResponseCode("403");
2611 responseBuilder.setResponseMessage(
2612 "invalid input, null or empty preload-vf-module-topology-information.vf-module-topology.vf-module-topology-identifier.vf-module-name");
2613 responseBuilder.setAckFinalIndicator("Y");
2615 RpcResult<PreloadVfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
2616 .<PreloadVfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2618 return Futures.immediateFuture(rpcResult);
2621 // Grab the preload ID from the input buffer
2622 String preloadId = input.getPreloadVfModuleTopologyInformation().getVfModuleTopology()
2623 .getVfModuleTopologyIdentifier().getVfModuleName();
2624 String preloadType = "vf-module";
2626 trySetSvcRequestId(input, responseBuilder);
2628 PreloadDataBuilder preloadDataBuilder = new PreloadDataBuilder();
2629 getPreloadData(preloadId, preloadType, preloadDataBuilder);
2631 PreloadDataBuilder operDataBuilder = new PreloadDataBuilder();
2632 getPreloadData(preloadId, preloadType, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
2635 // setup a preload-data object builder
2636 // ACTION preload-vf-module-topology-operation
2638 // uses sdnc-request-header;
2639 // uses request-information;
2640 // uses preload-vnf-topology-information;
2642 // uses preload-topology-response-body;
2644 // container preload-data
2645 // uses preload-vf-module-topology-information;
2646 // uses preload-oper-status;
2648 log.info(ADDING_INPUT_DATA_LOG, svcOperation, preloadId, input);
2649 PreloadVfModuleTopologyOperationInputBuilder inputBuilder = new PreloadVfModuleTopologyOperationInputBuilder(
2651 GenericResourceApiUtil.toProperties(properties, inputBuilder.build());
2652 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, preloadId, input);
2653 GenericResourceApiUtil.toProperties(properties, OPERATIONAL_DATA_PARAM, operDataBuilder);
2655 // Call SLI sync method
2656 ResponseObject responseObject = new ResponseObject("200", "");
2657 String ackFinal = "Y";
2658 Properties respProps = tryGetProperties(svcOperation, properties, preloadDataBuilder, responseObject);
2660 if (respProps != null) {
2661 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2662 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2663 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2666 if (failed(responseObject)) {
2667 responseBuilder.setResponseCode(responseObject.getStatusCode());
2668 responseBuilder.setResponseMessage(responseObject.getMessage());
2669 responseBuilder.setAckFinalIndicator(ackFinal);
2670 log.error(RETURNED_FAILED_MESSAGE, svcOperation, preloadId, responseBuilder.build());
2671 RpcResult<PreloadVfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
2672 .<PreloadVfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2673 return Futures.immediateFuture(rpcResult);
2676 // Got success from SLI
2678 preloadData = preloadDataBuilder.build();
2679 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, preloadId, preloadData);
2681 // preload-list object
2682 PreloadListBuilder preloadListBuilder = new PreloadListBuilder();
2683 preloadListBuilder.setPreloadId(preloadId);
2684 preloadListBuilder.setPreloadType(preloadType);
2685 preloadListBuilder.setPreloadData(preloadData);
2687 savePreloadList(preloadListBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
2688 log.info(UPDATING_TREE_INFO_MESSAGE);
2689 savePreloadList(preloadListBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
2691 tryDeletePreload(input, preloadListBuilder);
2693 } catch (Exception e) {
2694 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, preloadId, e);
2695 responseBuilder.setResponseCode("500");
2696 responseBuilder.setResponseMessage(e.getMessage());
2697 responseBuilder.setAckFinalIndicator("Y");
2698 log.error(RETURNED_FAILED_MESSAGE, svcOperation, preloadId, responseBuilder.build());
2699 RpcResult<PreloadVfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
2700 .<PreloadVfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2701 return Futures.immediateFuture(rpcResult);
2705 responseBuilder.setResponseCode(responseObject.getStatusCode());
2706 responseBuilder.setAckFinalIndicator(ackFinal);
2707 trySetResponseMessage(responseBuilder, responseObject);
2708 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, preloadId);
2709 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, preloadId, responseBuilder.build());
2711 RpcResult<PreloadVfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
2712 .<PreloadVfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2713 return Futures.immediateFuture(rpcResult);
2716 private boolean hasInvalidPreloadVfModule(PreloadVfModuleTopologyOperationInput input) {
2717 return input == null || input.getPreloadVfModuleTopologyInformation() == null
2718 || input.getPreloadVfModuleTopologyInformation().getVfModuleTopology() == null
2719 || input.getPreloadVfModuleTopologyInformation().getVfModuleTopology()
2720 .getVfModuleTopologyIdentifier() == null
2721 || input.getPreloadVfModuleTopologyInformation().getVfModuleTopology().getVfModuleTopologyIdentifier()
2722 .getVfModuleName() == null;
2725 private void trySetSvcRequestId(PreloadVfModuleTopologyOperationInput input,
2726 PreloadVfModuleTopologyOperationOutputBuilder responseBuilder) {
2727 if (input.getSdncRequestHeader() != null) {
2728 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
2732 private void trySetResponseMessage(PreloadVfModuleTopologyOperationOutputBuilder responseBuilder,
2733 ResponseObject responseObject) {
2734 if (responseObject.getMessage() != null) {
2735 if (!responseObject.getMessage().isEmpty()) {
2736 responseBuilder.setResponseMessage(responseObject.getMessage());
2741 private void tryDeletePreload(PreloadVfModuleTopologyOperationInput input, PreloadListBuilder preloadListBuilder) {
2742 if (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete)) {
2743 log.info("Delete from both CONFIGURATION and OPERATIONAL tree.");
2744 deletePreloadList(preloadListBuilder.build(), LogicalDatastoreType.OPERATIONAL);
2745 deletePreloadList(preloadListBuilder.build(), LogicalDatastoreType.CONFIGURATION);
2750 public ListenableFuture<RpcResult<GenericConfigurationTopologyOperationOutput>> genericConfigurationTopologyOperation(
2751 GenericConfigurationTopologyOperationInput input) {
2753 final String svcOperation = "generic-configuration-topology-operation";
2754 ServiceData serviceData;
2755 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
2756 Properties parms = new Properties();
2758 log.info(CALLED_STR, svcOperation);
2759 // create a new response object
2760 GenericConfigurationTopologyOperationOutputBuilder responseBuilder = new GenericConfigurationTopologyOperationOutputBuilder();
2762 if (hasInvalidService(input)) {
2763 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
2764 responseBuilder.setResponseCode("404");
2765 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
2766 responseBuilder.setAckFinalIndicator("Y");
2768 RpcResult<GenericConfigurationTopologyOperationOutput> rpcResult = RpcResultBuilder
2769 .<GenericConfigurationTopologyOperationOutput>status(true).withResult(responseBuilder.build())
2772 return Futures.immediateFuture(rpcResult);
2775 // Grab the service instance ID from the input buffer
2776 String siid = input.getServiceInformation().getServiceInstanceId();
2778 trySetSvcRequestId(input, responseBuilder);
2780 if (hasInvalidConfigurationIdOrType(input)) {
2781 log.debug("exiting {} because of null or empty configuration-id or configuration-type", svcOperation);
2782 responseBuilder.setResponseCode("404");
2783 responseBuilder.setResponseMessage("invalid input, null or empty configuration-id or configuration-type");
2784 responseBuilder.setAckFinalIndicator("Y");
2785 RpcResult<GenericConfigurationTopologyOperationOutput> rpcResult = RpcResultBuilder
2786 .<GenericConfigurationTopologyOperationOutput>status(true).withResult(responseBuilder.build())
2788 return Futures.immediateFuture(rpcResult);
2791 // Grab the configuration ID from the input buffer
2792 String configId = input.getConfigurationInformation().getConfigurationId();
2794 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
2795 getServiceData(siid, serviceDataBuilder);
2797 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
2798 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
2800 // Set the serviceStatus based on input
2801 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
2802 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
2804 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
2805 GenericConfigurationTopologyOperationInputBuilder inputBuilder = new GenericConfigurationTopologyOperationInputBuilder(
2807 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
2809 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
2810 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
2812 // Call SLI sync method
2814 ResponseObject responseObject = new ResponseObject("200", "");
2815 String ackFinal = "Y";
2816 String serviceObjectPath = "";
2817 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
2819 if (respProps != null) {
2820 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2821 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2822 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2823 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
2826 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
2827 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
2828 serviceStatusBuilder.setRpcName(svcOperation);
2830 if (failed(responseObject)) {
2831 responseBuilder.setResponseCode(responseObject.getStatusCode());
2832 responseBuilder.setResponseMessage(responseObject.getMessage());
2833 responseBuilder.setAckFinalIndicator(ackFinal);
2835 ServiceBuilder serviceBuilder = new ServiceBuilder();
2836 serviceBuilder.setServiceInstanceId(siid);
2837 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
2839 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
2840 } catch (Exception e) {
2841 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
2843 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2845 RpcResult<GenericConfigurationTopologyOperationOutput> rpcResult = RpcResultBuilder
2846 .<GenericConfigurationTopologyOperationOutput>status(true).withResult(responseBuilder.build())
2849 return Futures.immediateFuture(rpcResult);
2852 // Got success from SLI
2854 serviceData = serviceDataBuilder.build();
2857 ServiceBuilder serviceBuilder = new ServiceBuilder();
2858 serviceBuilder.setServiceData(serviceData);
2859 serviceBuilder.setServiceInstanceId(siid);
2860 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
2861 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
2863 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
2864 serviceResponseInformationBuilder.setInstanceId(siid);
2865 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
2866 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
2867 GcResponseInformationBuilder gcResponseInformationBuilder = new GcResponseInformationBuilder();
2868 gcResponseInformationBuilder.setInstanceId(configId);
2869 responseBuilder.setGcResponseInformation(gcResponseInformationBuilder.build());
2871 } catch (Exception e) {
2872 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
2873 responseBuilder.setResponseCode("500");
2874 responseBuilder.setResponseMessage(e.getMessage());
2875 responseBuilder.setAckFinalIndicator("Y");
2876 RpcResult<GenericConfigurationTopologyOperationOutput> rpcResult = RpcResultBuilder
2877 .<GenericConfigurationTopologyOperationOutput>status(true).withResult(responseBuilder.build())
2880 return Futures.immediateFuture(rpcResult);
2884 responseBuilder.setResponseCode(responseObject.getStatusCode());
2885 responseBuilder.setAckFinalIndicator(ackFinal);
2886 trySetResponseMessage(responseBuilder, responseObject);
2887 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
2888 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
2890 RpcResult<GenericConfigurationTopologyOperationOutput> rpcResult = RpcResultBuilder
2891 .<GenericConfigurationTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2893 return Futures.immediateFuture(rpcResult);
2896 private boolean hasInvalidService(GenericConfigurationTopologyOperationInput input) {
2897 return input == null || input.getServiceInformation() == null
2898 || input.getServiceInformation().getServiceInstanceId() == null
2899 || input.getServiceInformation().getServiceInstanceId().length() == 0;
2902 private void trySetSvcRequestId(GenericConfigurationTopologyOperationInput input,
2903 GenericConfigurationTopologyOperationOutputBuilder responseBuilder) {
2904 if (input.getSdncRequestHeader() != null) {
2905 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
2909 private boolean hasInvalidConfigurationIdOrType(GenericConfigurationTopologyOperationInput input) {
2910 return input.getConfigurationInformation() == null
2911 || input.getConfigurationInformation().getConfigurationId() == null
2912 || input.getConfigurationInformation().getConfigurationType() == null;
2915 private void trySetResponseMessage(GenericConfigurationTopologyOperationOutputBuilder responseBuilder,
2916 ResponseObject responseObject) {
2917 if (responseObject.getMessage() != null) {
2918 if (!responseObject.getMessage().isEmpty()) {
2919 responseBuilder.setResponseMessage(responseObject.getMessage());
2925 public ListenableFuture<RpcResult<GenericConfigurationNotificationOutput>> genericConfigurationNotification(GenericConfigurationNotificationInput input) {
2927 final String svcOperation = "generic-configuration-notification";
2928 ServiceData serviceData;
2929 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
2930 Properties parms = new Properties();
2932 log.info(CALLED_STR, svcOperation);
2934 // Grab the service instance ID from the input buffer
2935 String siid = input.getServiceInformation().getServiceInstanceId();
2937 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
2938 getServiceData(siid, serviceDataBuilder);
2940 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
2941 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
2943 // Set the serviceStatus based on input
2944 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
2945 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
2947 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
2948 GenericConfigurationNotificationInputBuilder inputBuilder = new GenericConfigurationNotificationInputBuilder(
2950 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
2952 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
2953 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
2955 // Call SLI sync method
2957 ResponseObject responseObject = new ResponseObject("200", "");
2958 String ackFinal = "Y";
2959 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
2961 if (respProps != null) {
2962 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2963 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2964 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2967 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
2968 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
2969 serviceStatusBuilder.setRpcName(svcOperation);
2971 if (failed(responseObject)) {
2972 ServiceBuilder serviceBuilder = new ServiceBuilder();
2973 serviceBuilder.setServiceInstanceId(siid);
2974 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
2976 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
2977 } catch (Exception e) {
2978 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
2984 RpcResult<GenericConfigurationNotificationOutput> rpcResult = RpcResultBuilder.<GenericConfigurationNotificationOutput>status(true).build();
2986 return Futures.immediateFuture(rpcResult);
2989 // Got success from SLI
2991 serviceData = serviceDataBuilder.build();
2994 ServiceBuilder serviceBuilder = new ServiceBuilder();
2995 serviceBuilder.setServiceData(serviceData);
2996 serviceBuilder.setServiceInstanceId(siid);
2997 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
2998 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
3000 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
3001 serviceResponseInformationBuilder.setInstanceId(siid);
3003 } catch (Exception e) {
3004 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3005 RpcResult<GenericConfigurationNotificationOutput> rpcResult = RpcResultBuilder.<GenericConfigurationNotificationOutput>status(true).build();
3007 return Futures.immediateFuture(rpcResult);
3011 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
3013 RpcResult<GenericConfigurationNotificationOutput> rpcResult = RpcResultBuilder.<GenericConfigurationNotificationOutput>status(true).build();
3015 return Futures.immediateFuture(rpcResult);
3019 public ListenableFuture<RpcResult<GetpathsegmentTopologyOperationOutput>> getpathsegmentTopologyOperation(
3020 GetpathsegmentTopologyOperationInput input) {
3022 final String svcOperation = "getpathsegment-topology-operation";
3023 ServiceData serviceData;
3024 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
3025 Properties parms = new Properties();
3027 log.info(CALLED_STR, svcOperation);
3028 // create a new response object
3029 GetpathsegmentTopologyOperationOutputBuilder responseBuilder = new GetpathsegmentTopologyOperationOutputBuilder();
3031 if (hasInvalidService(input)) {
3032 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
3033 responseBuilder.setResponseCode("404");
3034 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
3035 responseBuilder.setAckFinalIndicator("Y");
3037 RpcResult<GetpathsegmentTopologyOperationOutput> rpcResult = RpcResultBuilder
3038 .<GetpathsegmentTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3040 return Futures.immediateFuture(rpcResult);
3043 // Grab the service instance ID from the input buffer
3044 String siid = input.getServiceInformation().getServiceInstanceId();
3046 trySetSvcRequestId(input, responseBuilder);
3048 if (hasInvalidOnapModelInformation(input)) {
3049 log.debug("exiting {} because no model-uuid provided", svcOperation);
3050 responseBuilder.setResponseCode("404");
3051 responseBuilder.setResponseMessage("invalid input, no model-uuid provided");
3052 responseBuilder.setAckFinalIndicator("Y");
3053 RpcResult<GetpathsegmentTopologyOperationOutput> rpcResult = RpcResultBuilder
3054 .<GetpathsegmentTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3055 return Futures.immediateFuture(rpcResult);
3058 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
3059 getServiceData(siid, serviceDataBuilder);
3061 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
3062 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
3064 // Set the serviceStatus based on input
3065 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
3066 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
3068 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
3069 GetpathsegmentTopologyOperationInputBuilder inputBuilder = new GetpathsegmentTopologyOperationInputBuilder(
3071 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
3073 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
3074 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
3076 // Call SLI sync method
3078 ResponseObject responseObject = new ResponseObject("200", "");
3079 String ackFinal = "Y";
3080 String serviceObjectPath = null;
3081 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
3083 if (respProps != null) {
3084 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
3085 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
3086 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
3087 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
3090 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
3091 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
3092 serviceStatusBuilder.setRpcName(svcOperation);
3094 if (failed(responseObject)) {
3095 responseBuilder.setResponseCode(responseObject.getStatusCode());
3096 responseBuilder.setResponseMessage(responseObject.getMessage());
3097 responseBuilder.setAckFinalIndicator(ackFinal);
3099 ServiceBuilder serviceBuilder = new ServiceBuilder();
3100 serviceBuilder.setServiceInstanceId(siid);
3101 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3103 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
3104 } catch (Exception e) {
3105 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3107 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
3109 RpcResult<GetpathsegmentTopologyOperationOutput> rpcResult = RpcResultBuilder
3110 .<GetpathsegmentTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3112 return Futures.immediateFuture(rpcResult);
3115 // Got success from SLI
3117 serviceData = serviceDataBuilder.build();
3118 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
3121 ServiceBuilder serviceBuilder = new ServiceBuilder();
3122 serviceBuilder.setServiceData(serviceData);
3123 serviceBuilder.setServiceInstanceId(siid);
3124 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3125 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
3127 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
3128 serviceResponseInformationBuilder.setInstanceId(siid);
3129 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
3130 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
3132 } catch (Exception e) {
3133 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3134 responseBuilder.setResponseCode("500");
3135 responseBuilder.setResponseMessage(e.getMessage());
3136 responseBuilder.setAckFinalIndicator("Y");
3137 RpcResult<GetpathsegmentTopologyOperationOutput> rpcResult = RpcResultBuilder
3138 .<GetpathsegmentTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3140 return Futures.immediateFuture(rpcResult);
3144 responseBuilder.setResponseCode(responseObject.getStatusCode());
3145 responseBuilder.setAckFinalIndicator(ackFinal);
3146 trySetResponseMessage(responseBuilder, responseObject);
3147 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
3148 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
3150 RpcResult<GetpathsegmentTopologyOperationOutput> rpcResult = RpcResultBuilder
3151 .<GetpathsegmentTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3153 return Futures.immediateFuture(rpcResult);
3156 private boolean hasInvalidService(GetpathsegmentTopologyOperationInput input) {
3157 return input == null || input.getServiceInformation() == null
3158 || input.getServiceInformation().getServiceInstanceId() == null
3159 || input.getServiceInformation().getServiceInstanceId().length() == 0;
3162 private void trySetSvcRequestId(GetpathsegmentTopologyOperationInput input,
3163 GetpathsegmentTopologyOperationOutputBuilder responseBuilder) {
3164 if (input.getSdncRequestHeader() != null) {
3165 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
3169 private boolean hasInvalidOnapModelInformation(GetpathsegmentTopologyOperationInput input) {
3170 return input.getServiceInformation() == null || input.getServiceInformation().getOnapModelInformation() == null
3171 || input.getServiceInformation().getOnapModelInformation().getModelUuid() == null;
3174 private void trySetResponseMessage(GetpathsegmentTopologyOperationOutputBuilder responseBuilder,
3175 ResponseObject responseObject) {
3176 if (responseObject.getMessage() != null) {
3177 if (!responseObject.getMessage().isEmpty()) {
3178 responseBuilder.setResponseMessage(responseObject.getMessage());
3184 public ListenableFuture<RpcResult<PolicyUpdateNotifyOperationOutput>> policyUpdateNotifyOperation(
3185 PolicyUpdateNotifyOperationInput input) {
3187 final String svcOperation = "policy-update-notify-operation";
3188 Properties parms = new Properties();
3190 log.info(CALLED_STR, svcOperation);
3192 // create a new response object
3193 PolicyUpdateNotifyOperationOutputBuilder responseBuilder = new PolicyUpdateNotifyOperationOutputBuilder();
3195 // Make sure we have a valid input
3196 if (hasInvalidInput(input)) {
3197 log.debug("exiting {} because policy name, update type, or version id was not provided", svcOperation);
3198 responseBuilder.setErrorCode("404");
3199 responseBuilder.setErrorMsg("Invalid input, missing input data");
3200 RpcResult<PolicyUpdateNotifyOperationOutput> rpcResult = RpcResultBuilder
3201 .<PolicyUpdateNotifyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3202 return Futures.immediateFuture(rpcResult);
3205 log.info("Adding INPUT data for {} input: {}", svcOperation, input);
3206 PolicyUpdateNotifyOperationInputBuilder inputBuilder = new PolicyUpdateNotifyOperationInputBuilder(input);
3207 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
3209 // Call SLI sync method
3210 ResponseObject responseObject = new ResponseObject("200", "");
3211 String ackFinal = "Y";
3212 String serviceObjectPath = null;
3213 Properties respProps = tryGetProperties(svcOperation, parms, responseObject);
3215 if (respProps != null) {
3216 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
3217 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
3218 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
3219 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
3222 if (failed(responseObject)) {
3223 responseBuilder.setErrorCode(responseObject.getStatusCode());
3224 responseBuilder.setErrorMsg(responseObject.getMessage());
3225 log.error(RETURNED_FAILED_MESSAGE, svcOperation, "policy update", responseBuilder.build());
3227 RpcResult<PolicyUpdateNotifyOperationOutput> rpcResult = RpcResultBuilder
3228 .<PolicyUpdateNotifyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3230 return Futures.immediateFuture(rpcResult);
3233 // Got success from SLI
3234 responseBuilder.setErrorCode(responseObject.getStatusCode());
3235 if (responseObject.getMessage() != null) {
3236 responseBuilder.setErrorMsg(responseObject.getMessage());
3238 log.info("Returned SUCCESS for " + svcOperation + responseBuilder.build());
3239 RpcResult<PolicyUpdateNotifyOperationOutput> rpcResult = RpcResultBuilder
3240 .<PolicyUpdateNotifyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3242 return Futures.immediateFuture(rpcResult);
3245 private boolean hasInvalidInput(PolicyUpdateNotifyOperationInput input) {
3246 return (input.getPolicyName() == null) || (input.getUpdateType() == null) || (input.getVersionId() == null);
3250 public ListenableFuture<RpcResult<PortMirrorTopologyOperationOutput>> portMirrorTopologyOperation(
3251 final PortMirrorTopologyOperationInput input) {
3253 final String svcOperation = "port-mirror-topology-operation";
3254 ServiceData serviceData = null;
3255 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
3256 Properties properties = new Properties();
3258 log.info(CALLED_STR, svcOperation);
3260 // create a new response object
3261 PortMirrorTopologyOperationOutputBuilder responseBuilder = new PortMirrorTopologyOperationOutputBuilder();
3263 if (hasInvalidService(input)) {
3264 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
3265 responseBuilder.setResponseCode("404");
3266 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
3267 responseBuilder.setAckFinalIndicator("Y");
3268 RpcResult<PortMirrorTopologyOperationOutput> rpcResult = RpcResultBuilder
3269 .<PortMirrorTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3271 return Futures.immediateFuture(rpcResult);
3274 if (hasInvalidConfigurationId(input)) {
3275 log.debug("exiting {} because of null or empty configuration-id", svcOperation);
3276 responseBuilder.setResponseCode("404");
3277 responseBuilder.setResponseMessage("invalid input, null or empty configuration-id");
3278 responseBuilder.setAckFinalIndicator("Y");
3279 RpcResult<PortMirrorTopologyOperationOutput> rpcResult = RpcResultBuilder
3280 .<PortMirrorTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3281 return Futures.immediateFuture(rpcResult);
3284 // Grab the service instance ID from the input buffer
3285 String siid = input.getServiceInformation().getServiceInstanceId();
3287 trySetSvcRequestId(input, responseBuilder);
3289 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
3290 getServiceData(siid, serviceDataBuilder);
3292 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
3293 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
3295 // Set the serviceStatus based on input
3296 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
3297 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
3299 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
3300 PortMirrorTopologyOperationInputBuilder inputBuilder = new PortMirrorTopologyOperationInputBuilder(input);
3301 GenericResourceApiUtil.toProperties(properties, inputBuilder.build());
3303 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
3304 GenericResourceApiUtil.toProperties(properties, OPERATIONAL_DATA_PARAM, operDataBuilder);
3306 // Call SLI sync method
3307 ResponseObject responseObject = new ResponseObject("200", "");
3308 String ackFinal = "Y";
3309 String serviceObjectPath = null;
3310 String portMirrorObjectPath = null;
3311 Properties respProps = tryGetProperties(svcOperation, properties, serviceDataBuilder, responseObject);
3313 if (respProps != null) {
3314 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
3315 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
3316 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
3317 serviceObjectPath = respProps.getProperty("service-object-path");
3318 portMirrorObjectPath = respProps.getProperty("port-mirror-object-path");
3321 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
3322 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
3323 serviceStatusBuilder.setRpcName(svcOperation);
3325 if (failed(responseObject)) {
3326 responseBuilder.setResponseCode(responseObject.getStatusCode());
3327 responseBuilder.setResponseMessage(responseObject.getMessage());
3328 responseBuilder.setAckFinalIndicator(ackFinal);
3330 ServiceBuilder serviceBuilder = new ServiceBuilder();
3331 serviceBuilder.setServiceInstanceId(siid);
3332 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3334 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
3335 } catch (Exception e) {
3336 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3338 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
3340 RpcResult<PortMirrorTopologyOperationOutput> rpcResult = RpcResultBuilder
3341 .<PortMirrorTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3344 return Futures.immediateFuture(rpcResult);
3347 // Got success from SLI
3349 serviceData = serviceDataBuilder.build();
3350 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
3353 ServiceBuilder serviceBuilder = new ServiceBuilder();
3354 serviceBuilder.setServiceData(serviceData);
3355 serviceBuilder.setServiceInstanceId(siid);
3356 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3357 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
3359 if (input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null) {
3360 // Only update operational tree on activate or delete
3361 if (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign)
3362 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)) {
3363 log.info(UPDATING_TREE_INFO_MESSAGE);
3364 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
3368 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
3369 serviceResponseInformationBuilder.setInstanceId(siid);
3370 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
3371 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
3372 PortMirrorResponseInformationBuilder portMirrorResponseInformationBuilder = new PortMirrorResponseInformationBuilder();
3373 portMirrorResponseInformationBuilder
3374 .setInstanceId(input.getConfigurationInformation().getConfigurationId());
3375 portMirrorResponseInformationBuilder.setObjectPath(portMirrorObjectPath);
3376 responseBuilder.setPortMirrorResponseInformation(portMirrorResponseInformationBuilder.build());
3378 } catch (Exception e) {
3379 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3380 responseBuilder.setResponseCode("500");
3381 responseBuilder.setResponseMessage(e.getMessage());
3382 responseBuilder.setAckFinalIndicator("Y");
3383 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
3384 RpcResult<PortMirrorTopologyOperationOutput> rpcResult = RpcResultBuilder
3385 .<PortMirrorTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3386 return Futures.immediateFuture(rpcResult);
3390 responseBuilder.setResponseCode(responseObject.getStatusCode());
3391 responseBuilder.setAckFinalIndicator(ackFinal);
3392 trySetResponseMessage(responseBuilder, responseObject);
3393 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
3394 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
3396 RpcResult<PortMirrorTopologyOperationOutput> rpcResult = RpcResultBuilder
3397 .<PortMirrorTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3399 if (ackFinal.equals("N")) {
3400 // Spawn background thread to invoke the Async DG
3401 Runnable backgroundThread = new Runnable() {
3403 log.info(BACKGROUND_THREAD_STARTED_MESSAGE);
3404 processAsyncPortMirrorTopologyOperation(input);
3407 new Thread(backgroundThread).start();
3411 return Futures.immediateFuture(rpcResult);
3414 private boolean hasInvalidService(PortMirrorTopologyOperationInput input) {
3415 return input == null || input.getServiceInformation() == null
3416 || input.getServiceInformation().getServiceInstanceId() == null
3417 || input.getServiceInformation().getServiceInstanceId().length() == 0;
3420 private boolean hasInvalidConfigurationId(PortMirrorTopologyOperationInput input) {
3421 return input.getConfigurationInformation() == null
3422 || input.getConfigurationInformation().getConfigurationId() == null
3423 || input.getConfigurationInformation().getConfigurationId().length() == 0;
3426 private void trySetSvcRequestId(PortMirrorTopologyOperationInput input,
3427 PortMirrorTopologyOperationOutputBuilder responseBuilder) {
3428 if (input.getSdncRequestHeader() != null) {
3429 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
3433 private void trySetResponseMessage(PortMirrorTopologyOperationOutputBuilder responseBuilder,
3434 ResponseObject responseObject) {
3435 if (responseObject.getMessage() != null) {
3436 if (!responseObject.getMessage().isEmpty()) {
3437 responseBuilder.setResponseMessage(responseObject.getMessage());
3442 public void processAsyncPortMirrorTopologyOperation(PortMirrorTopologyOperationInput input) {
3443 log.info(BACKGROUND_THREAD_INFO, input.getConfigurationInformation().getConfigurationId());
3445 final String svcOperation = "port-mirror-topology-operation-async";
3446 ServiceData serviceData = null;
3447 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
3448 Properties parms = new Properties();
3450 log.info(CALLED_STR, svcOperation);
3452 // Grab the service instance ID from the input buffer
3453 String siid = input.getServiceInformation().getServiceInstanceId();
3455 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
3456 getServiceData(siid, serviceDataBuilder);
3458 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
3459 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
3461 // Set the serviceStatus based on input
3462 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
3463 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
3465 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
3466 PortMirrorTopologyOperationInputBuilder inputBuilder = new PortMirrorTopologyOperationInputBuilder(input);
3467 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
3469 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
3470 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
3472 // Call SLI sync method
3473 ResponseObject responseObject = new ResponseObject("200", "");
3474 String ackFinal = "Y";
3475 String serviceObjectPath = null;
3476 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
3478 if (respProps != null) {
3479 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
3480 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
3481 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
3484 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
3485 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
3486 serviceStatusBuilder.setRpcName(svcOperation);
3488 if (failed(responseObject)) {
3489 ServiceBuilder serviceBuilder = new ServiceBuilder();
3490 serviceBuilder.setServiceInstanceId(siid);
3491 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3493 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
3494 } catch (Exception e) {
3495 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3502 // Got success from SLI
3504 serviceData = serviceDataBuilder.build();
3505 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
3508 ServiceBuilder serviceBuilder = new ServiceBuilder();
3509 serviceBuilder.setServiceData(serviceData);
3510 serviceBuilder.setServiceInstanceId(siid);
3511 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3512 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
3514 if (input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null) {
3515 // Only update operational tree on activate or delete
3516 if (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign)
3517 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)) {
3518 log.info(UPDATING_TREE_INFO_MESSAGE);
3519 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
3523 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
3524 serviceResponseInformationBuilder.setInstanceId(siid);
3525 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
3527 } catch (Exception e) {
3528 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3533 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
3539 public ListenableFuture<RpcResult<VnfGetResourceRequestOutput>> vnfGetResourceRequest(VnfGetResourceRequestInput input) {
3541 final String svcOperation = "vnf-get-resource-request";
3542 ServiceData serviceData;
3543 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
3544 Properties parms = new Properties();
3546 log.info(CALLED_STR, svcOperation);
3547 // create a new response object
3548 VnfGetResourceRequestOutputBuilder responseBuilder = new VnfGetResourceRequestOutputBuilder();
3550 if (hasInvalidService(input)) {
3551 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
3552 RpcResult<VnfGetResourceRequestOutput> rpcResult = RpcResultBuilder
3553 .<VnfGetResourceRequestOutput>status(true).withResult(responseBuilder.build()).build();
3555 return Futures.immediateFuture(rpcResult);
3558 // Grab the service instance ID from the input buffer
3559 String siid = input.getServiceInformation().getServiceInstanceId();
3561 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
3562 getServiceData(siid, serviceDataBuilder);
3564 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
3565 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
3567 // Set the serviceStatus based on input
3568 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
3569 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
3571 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
3572 VnfGetResourceRequestInputBuilder inputBuilder = new VnfGetResourceRequestInputBuilder(input);
3573 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
3575 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
3576 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
3578 // Call SLI sync method
3580 ResponseObject responseObject = new ResponseObject("200", "");
3581 String ackFinal = "Y";
3582 String serviceObjectPath = null;
3583 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
3585 if (respProps != null) {
3586 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
3587 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
3588 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
3589 serviceObjectPath = respProps.getProperty("service-object-path");
3592 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
3593 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
3594 serviceStatusBuilder.setRpcName(svcOperation);
3596 if (failed(responseObject)) {
3597 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
3598 RpcResult<VnfGetResourceRequestOutput> rpcResult = RpcResultBuilder
3599 .<VnfGetResourceRequestOutput>status(true).withResult(responseBuilder.build()).build();
3601 return Futures.immediateFuture(rpcResult);
3604 // Got success from SLI
3605 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
3607 if (respProps != null) {
3608 GenericResourceApiUtil.toBuilder(respProps, responseBuilder);
3611 RpcResult<VnfGetResourceRequestOutput> rpcResult = RpcResultBuilder.<VnfGetResourceRequestOutput>status(true)
3612 .withResult(responseBuilder.build()).build();
3615 return Futures.immediateFuture(rpcResult);
3618 private boolean hasInvalidService(VnfGetResourceRequestInput input) {
3619 return input == null || input.getServiceInformation() == null
3620 || input.getServiceInformation().getServiceInstanceId() == null
3621 || input.getServiceInformation().getServiceInstanceId().length() == 0;