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 helper class which provides storage for
140 * the most commonly used components of the MD-SAL. Additionally the base class provides some basic logging and
141 * initialization / clean up methods.
143 * To use this, copy and paste (overwrite) the following method into the TestApplicationProviderModule class which is
144 * auto generated under src/main/java in this project (created only once during first compilation):
149 * public java.lang.AutoCloseable createInstance() {
151 * // final GENERIC-RESOURCE-APIProvider provider = new
152 * // GENERIC-RESOURCE-APIProvider();
153 * final GenericResourceApiProvider provider = new GenericResourceApiProvider();
154 * provider.setDataBroker(getDataBrokerDependency());
155 * provider.setNotificationService(getNotificationServiceDependency());
156 * provider.setRpcRegistry(getRpcRegistryDependency());
157 * provider.initialize();
158 * return new AutoCloseable() {
161 * public void close() throws Exception {
162 * // TODO: CLOSE ANY REGISTRATION OBJECTS CREATED USING ABOVE
163 * // BROKER/NOTIFICATION
164 * // SERVIE/RPC REGISTRY
173 public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURCEAPIService {
175 protected static final String APP_NAME = "generic-resource-api";
176 private static final String CALLED_STR = "{} called.";
177 private static final String NULL_OR_EMPTY_ERROR_MESSAGE = "exiting {} because of null or empty service-instance-id";
178 protected static final String NULL_OR_EMPTY_ERROR_PARAM = "invalid input, null or empty service-instance-id";
179 private static final String ADDING_INPUT_DATA_LOG = "Adding INPUT data for {} [{}] input: {}";
180 private static final String ADDING_OPERATIONAL_DATA_LOG = "Adding OPERATIONAL data for {} [{}] operational-data: {}";
181 private static final String OPERATIONAL_DATA_PARAM = "operational-data";
182 protected static final String NO_SERVICE_LOGIC_ACTIVE = "No service logic active for ";
183 private static final String SERVICE_LOGIC_SEARCH_ERROR_MESSAGE = "Caught exception looking for service logic";
184 private static final String ERROR_CODE_PARAM = "error-code";
185 private static final String ERROR_MESSAGE_PARAM = "error-message";
186 private static final String ACK_FINAL_PARAM = "ack-final";
187 private static final String SERVICE_OBJECT_PATH_PARAM = "service-object-path";
188 private static final String NETWORK_OBJECT_PATH_PARAM = "network-object-path";
189 private static final String VNF_OBJECT_PATH_PARAM = "vnf-object-path";
190 private static final String PNF_OBJECT_PATH_PARAM = "pnf-object-path";
191 private static final String VF_MODULE_OBJECT_PATH_PARAM = "vf-module-object-path";
192 private static final String VF_MODULE_ID_PARAM = "vf-module-id";
193 private static final String UPDATING_MDSAL_ERROR_MESSAGE = "Caught Exception updating MD-SAL for {} [{}] \n";
194 private static final String UPDATING_MDSAL_ERROR_MESSAGE_2 = "Caught Exception updating MD-SAL for {} [{},{}] \n";
195 private static final String RETURNED_FAILED_MESSAGE = "Returned FAILED for {} [{}] {}";
196 private static final String UPDATING_MDSAL_INFO_MESSAGE = "Updating MD-SAL for {} [{}] ServiceData: {}";
197 private static final String UPDATED_MDSAL_INFO_MESSAGE = "Updated MD-SAL for {} [{}]";
198 private static final String RETURNED_SUCCESS_MESSAGE = "Returned SUCCESS for {} [{}] {}";
199 private static final String NON_NULL_PARAM = "non-null";
200 private static final String NULL_PARAM = "null";
201 private static final String SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE = "Caught exception executing service logic for {} ";
202 private static final String UPDATING_TREE_INFO_MESSAGE = "Updating OPERATIONAL tree.";
203 private static final String EMPTY_SERVICE_INSTANCE_MESSAGE = "exiting {} because the service-instance does not have any service data in SDNC";
204 protected static final String INVALID_INPUT_ERROR_MESSAGE = "invalid input: the service-instance does not have any service data in SDNC";
205 private static final String ALLOTTED_RESOURCE_ID_PARAM = "allotted-resource-id";
206 private static final String ERROR_NETWORK_ID = "error";
207 private static final String BACKGROUND_THREAD_STARTED_MESSAGE = "Start background thread";
208 private static final String BACKGROUND_THREAD_INFO = "Background thread: input conf_id is {}";
209 private static final String SKIP_MDSAL_UPDATE_PROP = "skip-mdsal-update";
211 private final Logger log = LoggerFactory.getLogger(GenericResourceApiProvider.class);
212 private final ExecutorService executor;
213 private final GenericResourceApiSvcLogicServiceClient svcLogicClient;
215 protected DataBroker dataBroker;
216 protected NotificationPublishService notificationService;
217 protected RpcProviderRegistry rpcRegistry;
218 protected BindingAwareBroker.RpcRegistration<GENERICRESOURCEAPIService> rpcRegistration;
220 public GenericResourceApiProvider(DataBroker dataBroker, NotificationPublishService notificationPublishService,
221 RpcProviderRegistry rpcProviderRegistry, GenericResourceApiSvcLogicServiceClient client) {
222 log.info("Creating provider for {}", APP_NAME);
223 executor = Executors.newFixedThreadPool(1);
224 setDataBroker(dataBroker);
225 setNotificationService(notificationPublishService);
226 setRpcRegistry(rpcProviderRegistry);
227 svcLogicClient = client;
232 public void initialize() {
233 log.info("Initializing provider for {}", APP_NAME);
234 // Create the top level containers
237 GenericResourceApiUtil.loadProperties();
238 } catch (Exception e) {
239 log.error("Caught Exception while trying to load properties file", e);
242 log.info("Initialization complete for {}", APP_NAME);
245 protected void initializeChild() {
246 // Override if you have custom initialization intelligence
250 public void close() throws Exception {
251 log.info("Closing provider for {}", APP_NAME);
253 rpcRegistration.close();
254 log.info("Successfully closed provider for {}", APP_NAME);
257 private static class Iso8601Util {
259 private static TimeZone timeZone = TimeZone.getTimeZone("UTC");
260 private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
262 private Iso8601Util() {
266 dateFormat.setTimeZone(timeZone);
269 private static String now() {
270 return dateFormat.format(new Date());
274 public void setDataBroker(DataBroker dataBroker) {
275 this.dataBroker = dataBroker;
276 if (log.isDebugEnabled()) {
277 log.debug("DataBroker set to {}", dataBroker == null ? NULL_PARAM : NON_NULL_PARAM);
281 public void setNotificationService(NotificationPublishService notificationService) {
282 this.notificationService = notificationService;
283 if (log.isDebugEnabled()) {
284 log.debug("Notification Service set to {}", notificationService == null ? NULL_PARAM : NON_NULL_PARAM);
288 public void setRpcRegistry(RpcProviderRegistry rpcRegistry) {
289 this.rpcRegistry = rpcRegistry;
290 if (log.isDebugEnabled()) {
291 log.debug("RpcRegistry set to {}", rpcRegistry == null ? NULL_PARAM : NON_NULL_PARAM);
295 private void createContainers() {
297 final WriteTransaction t = dataBroker.newReadWriteTransaction();
299 // Create the service-instance container
300 t.merge(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Services.class),
301 new ServicesBuilder().build());
302 t.merge(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Services.class),
303 new ServicesBuilder().build());
305 // Create the PreloadInformation container
306 t.merge(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(PreloadInformation.class),
307 new PreloadInformationBuilder().build());
308 t.merge(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(PreloadInformation.class),
309 new PreloadInformationBuilder().build());
312 CheckedFuture<Void, TransactionCommitFailedException> checkedFuture = t.submit();
314 log.info("Create containers succeeded!");
316 } catch (InterruptedException | ExecutionException e) {
317 log.error("Create containers failed: ", e);
321 private void setServiceStatus(ServiceStatusBuilder serviceStatusBuilder, String errorCode, String errorMessage,
323 serviceStatusBuilder.setResponseCode(errorCode);
324 serviceStatusBuilder.setResponseMessage(errorMessage);
325 serviceStatusBuilder.setFinalIndicator(ackFinal);
326 serviceStatusBuilder.setResponseTimestamp(Iso8601Util.now());
329 private void setServiceStatus(ServiceStatusBuilder serviceStatusBuilder, RequestInformation requestInformation) {
330 if (requestInformation != null && requestInformation.getRequestAction() != null) {
331 serviceStatusBuilder.setAction(requestInformation.getRequestAction().toString());
335 private void setServiceStatus(ServiceStatusBuilder serviceStatusBuilder, SdncRequestHeader requestHeader) {
336 if (requestHeader != null && requestHeader.getSvcAction() != null) {
337 switch (requestHeader.getSvcAction()) {
339 serviceStatusBuilder.setRpcAction(RpcAction.Assign);
342 serviceStatusBuilder.setRpcAction(RpcAction.Unassign);
345 serviceStatusBuilder.setRpcAction(RpcAction.Activate);
348 serviceStatusBuilder.setRpcAction(RpcAction.Deactivate);
351 serviceStatusBuilder.setRpcAction(RpcAction.Delete);
354 serviceStatusBuilder.setRpcAction(RpcAction.Create);
357 log.error("Unknown SvcAction: {}", requestHeader.getSvcAction());
363 private void getServiceData(String siid, ServiceDataBuilder serviceDataBuilder) {
365 getServiceData(siid, serviceDataBuilder, LogicalDatastoreType.CONFIGURATION);
368 private void getServiceData(String siid, ServiceDataBuilder serviceDataBuilder, LogicalDatastoreType type) {
369 // See if any data exists yet for this siid, if so grab it.
370 InstanceIdentifier<Service> serviceInstanceIdentifier = InstanceIdentifier.builder(Services.class)
371 .child(Service.class, new ServiceKey(siid)).build();
373 Optional<Service> data = Optional.absent();
374 try (final ReadOnlyTransaction readTx = dataBroker.newReadOnlyTransaction()) {
375 data = readTx.read(type, serviceInstanceIdentifier).get();
376 } catch (final InterruptedException | ExecutionException e) {
377 log.error("Caught Exception reading MD-SAL ({}) data for [{}] ", type, siid, e);
380 if (data != null && data.isPresent()) {
381 ServiceData serviceData = data.get().getServiceData();
382 if (serviceData != null) {
383 log.info("Read MD-SAL ({}) data for [{}] ServiceData: {}", type, siid, serviceData);
384 serviceDataBuilder.setSdncRequestHeader(serviceData.getSdncRequestHeader());
385 serviceDataBuilder.setRequestInformation(serviceData.getRequestInformation());
386 serviceDataBuilder.setServiceInformation(serviceData.getServiceInformation());
387 serviceDataBuilder.setServiceRequestInput(serviceData.getServiceRequestInput());
388 serviceDataBuilder.setServiceTopology(serviceData.getServiceTopology());
389 serviceDataBuilder.setServiceLevelOperStatus(serviceData.getServiceLevelOperStatus());
390 serviceDataBuilder.setNetworks(serviceData.getNetworks());
391 serviceDataBuilder.setVnfs(serviceData.getVnfs());
392 serviceDataBuilder.setProvidedAllottedResources(serviceData.getProvidedAllottedResources());
393 serviceDataBuilder.setConsumedAllottedResources(serviceData.getConsumedAllottedResources());
394 serviceDataBuilder.setNetworkInstanceGroups(serviceData.getNetworkInstanceGroups());
395 serviceDataBuilder.setVnfcInstanceGroups(serviceData.getVnfcInstanceGroups());
396 serviceDataBuilder.setForwardingPaths(serviceData.getForwardingPaths());
397 serviceDataBuilder.setProvidedConfigurations(serviceData.getProvidedConfigurations());
398 // service-instance-id needs to be set
400 log.info("No service-data found in MD-SAL ({}) for [{}]", type, siid);
403 log.info("No data found in MD-SAL ({}) for [{}]", type, siid);
407 private void saveService(final Service entry, boolean merge, LogicalDatastoreType storeType) {
408 // Each entry will be identifiable by a unique key, we have to create that
410 InstanceIdentifier<Service> path = InstanceIdentifier.builder(Services.class)
411 .child(Service.class, entry.key()).build();
413 trySaveEntry(entry, merge, storeType, path);
416 private <T extends DataObject> void trySaveEntry(T entry, boolean merge, LogicalDatastoreType storeType,
417 InstanceIdentifier<T> path) {
421 save(entry, merge, storeType, path);
423 } catch (OptimisticLockFailedException e) {
425 log.debug("Got OptimisticLockFailedException on last try - failing ");
426 throw new IllegalStateException(e);
428 log.debug("Got OptimisticLockFailedException - trying again ");
429 } catch (TransactionCommitFailedException ex) {
430 log.debug("Update DataStore failed");
431 throw new IllegalStateException(ex);
436 private <T extends DataObject> void save(T entry, boolean merge, LogicalDatastoreType storeType,
437 InstanceIdentifier<T> path) throws TransactionCommitFailedException {
438 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
440 tx.merge(storeType, path, entry);
442 tx.put(storeType, path, entry);
444 tx.submit().checkedGet();
445 log.debug("Update DataStore succeeded");
448 private void deleteService(final Service entry, LogicalDatastoreType storeType) {
449 // Each entry will be identifiable by a unique key, we have to create
451 InstanceIdentifier<Service> path = InstanceIdentifier.builder(Services.class)
452 .child(Service.class, entry.key()).build();
454 tryDeleteEntry(storeType, path);
457 private void tryDeleteEntry(LogicalDatastoreType storeType, InstanceIdentifier<Service> path) {
461 delete(storeType, path);
463 } catch (OptimisticLockFailedException e) {
465 log.debug("Got OptimisticLockFailedException on last try - failing ");
466 throw new IllegalStateException(e);
468 log.debug("Got OptimisticLockFailedException - trying again ");
469 } catch (TransactionCommitFailedException ex) {
470 log.debug("Update DataStore failed");
471 throw new IllegalStateException(ex);
476 private void delete(LogicalDatastoreType storeType, InstanceIdentifier<Service> path)
477 throws TransactionCommitFailedException {
478 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
479 tx.delete(storeType, path);
480 tx.submit().checkedGet();
481 log.debug("DataStore delete succeeded");
484 private void getPreloadData(String vnf_name, String vnf_type, PreloadDataBuilder preloadDataBuilder) {
486 getPreloadData(vnf_name, vnf_type, preloadDataBuilder, LogicalDatastoreType.CONFIGURATION);
489 private void getPreloadData(String preloadName, String preloadType, PreloadDataBuilder preloadDataBuilder,
490 LogicalDatastoreType type) {
491 // See if any data exists yet for this name/type, if so grab it.
492 InstanceIdentifier preloadInstanceIdentifier = InstanceIdentifier
493 .<PreloadInformation>builder(PreloadInformation.class)
494 .child(PreloadList.class, new PreloadListKey(preloadName, preloadType)).build();
496 Optional<PreloadList> data = null;
497 try (final ReadOnlyTransaction readTx = dataBroker.newReadOnlyTransaction()) {
498 data = (Optional<PreloadList>) readTx.read(type, preloadInstanceIdentifier).get();
499 } catch (final InterruptedException | ExecutionException e) {
500 log.error("Caught Exception reading MD-SAL ({}) for [{},{}] ", type, preloadName, preloadType, e);
503 if (data != null && data.isPresent()) {
504 PreloadData preloadData = data.get().getPreloadData();
505 if (preloadData != null) {
506 log.info("Read MD-SAL ({}) data for [{},{}] PreloadData: {}", type, preloadName, preloadType,
509 .setPreloadVfModuleTopologyInformation(preloadData.getPreloadVfModuleTopologyInformation());
511 .setPreloadNetworkTopologyInformation(preloadData.getPreloadNetworkTopologyInformation());
512 preloadDataBuilder.setPreloadOperStatus(preloadData.getPreloadOperStatus());
514 log.info("No preload-data found in MD-SAL ({}) for [{},{}] ", type, preloadName, preloadType);
517 log.info("No data found in MD-SAL ({}) for [{},{}] ", type, preloadName, preloadType);
521 private void savePreloadList(final PreloadList entry, boolean merge, LogicalDatastoreType storeType)
522 throws IllegalStateException {
524 // Each entry will be identifiable by a unique key, we have to create that
526 InstanceIdentifier.InstanceIdentifierBuilder<PreloadList> preloadListBuilder = InstanceIdentifier
527 .<PreloadInformation>builder(PreloadInformation.class).child(PreloadList.class, entry.key());
528 InstanceIdentifier<PreloadList> path = preloadListBuilder.build();
532 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
534 tx.merge(storeType, path, entry);
536 tx.put(storeType, path, entry);
538 tx.submit().checkedGet();
539 log.debug("Update DataStore succeeded");
541 } catch (final TransactionCommitFailedException e) {
542 if (e instanceof OptimisticLockFailedException) {
544 log.debug("Got OptimisticLockFailedException on last try - failing ");
545 throw new IllegalStateException(e);
547 log.debug("Got OptimisticLockFailedException - trying again ");
549 log.debug("Update DataStore failed");
550 throw new IllegalStateException(e);
556 private void deletePreloadList(final PreloadList entry, LogicalDatastoreType storeType) {
557 // Each entry will be identifiable by a unique key, we have to create
559 InstanceIdentifier<PreloadList> path = InstanceIdentifier.builder(PreloadInformation.class)
560 .child(PreloadList.class, entry.key()).build();
562 tryDeletePreloadListEntry(storeType, path);
565 private void tryDeletePreloadListEntry(LogicalDatastoreType storeType, InstanceIdentifier<PreloadList> path) {
569 deletePreloadList(storeType, path);
571 } catch (OptimisticLockFailedException e) {
573 log.debug("Got OptimisticLockFailedException on last try - failing ");
574 throw new IllegalStateException(e);
576 log.debug("Got OptimisticLockFailedException - trying again ");
577 } catch (TransactionCommitFailedException ex) {
578 log.debug("Update DataStore failed");
579 throw new IllegalStateException(ex);
584 private void deletePreloadList(LogicalDatastoreType storeType, InstanceIdentifier<PreloadList> path)
585 throws TransactionCommitFailedException {
586 WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
587 tx.delete(storeType, path);
588 tx.submit().checkedGet();
589 log.debug("DataStore delete succeeded");
593 public ListenableFuture<RpcResult<ServiceTopologyOperationOutput>> serviceTopologyOperation(
594 ServiceTopologyOperationInput input) {
596 final String svcOperation = "service-topology-operation";
597 ServiceData serviceData;
598 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
599 Properties parms = new Properties();
601 log.info(CALLED_STR, svcOperation);
602 // create a new response object
603 ServiceTopologyOperationOutputBuilder responseBuilder = new ServiceTopologyOperationOutputBuilder();
605 if (hasInvalidServiceId(input)) {
606 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
607 responseBuilder.setResponseCode("404");
608 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
609 responseBuilder.setAckFinalIndicator("Y");
611 RpcResult<ServiceTopologyOperationOutput> rpcResult = RpcResultBuilder
612 .<ServiceTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
614 return Futures.immediateFuture(rpcResult);
617 // Grab the service instance ID from the input buffer
618 String siid = input.getServiceInformation().getServiceInstanceId();
620 trySetSvcRequestId(input, responseBuilder);
622 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
623 getServiceData(siid, serviceDataBuilder);
625 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
626 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
628 // Set the serviceStatus based on input
629 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
630 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
633 * // setup a service-data object builder // ACTION service-topology-operation
634 * // INPUT: // USES uses service-operation-information // OUTPUT: // uses
635 * topology-response-common; // uses service-response-information;
638 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
639 ServiceTopologyOperationInputBuilder inputBuilder = new ServiceTopologyOperationInputBuilder(input);
640 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
642 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
643 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
645 // Call SLI sync method
646 ResponseObject responseObject = new ResponseObject("200", "");
647 String ackFinal = "Y";
648 String serviceObjectPath = null;
649 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
651 if (respProps != null) {
652 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
653 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
654 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
655 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
658 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
659 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
660 serviceStatusBuilder.setRpcName(svcOperation);
662 if (failed(responseObject)) {
663 responseBuilder.setResponseCode(responseObject.getStatusCode());
664 responseBuilder.setResponseMessage(responseObject.getMessage());
665 responseBuilder.setAckFinalIndicator(ackFinal);
667 ServiceBuilder serviceBuilder = new ServiceBuilder();
668 serviceBuilder.setServiceInstanceId(siid);
669 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
671 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
672 } catch (Exception e) {
673 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
675 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
677 RpcResult<ServiceTopologyOperationOutput> rpcResult = RpcResultBuilder
678 .<ServiceTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
680 return Futures.immediateFuture(rpcResult);
683 // Got success from SLI
685 serviceData = serviceDataBuilder.build();
686 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
689 ServiceBuilder serviceBuilder = new ServiceBuilder();
690 serviceBuilder.setServiceData(serviceData);
691 serviceBuilder.setServiceInstanceId(siid);
692 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
693 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
695 tryDeleteService(input, serviceBuilder);
697 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
698 serviceResponseInformationBuilder.setInstanceId(siid);
699 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
700 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
702 } catch (Exception e) {
703 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
704 responseBuilder.setResponseCode("500");
705 responseBuilder.setResponseMessage(e.getMessage());
706 responseBuilder.setAckFinalIndicator("Y");
707 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
709 RpcResult<ServiceTopologyOperationOutput> rpcResult = RpcResultBuilder
710 .<ServiceTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
712 return Futures.immediateFuture(rpcResult);
716 responseBuilder.setResponseCode(responseObject.getStatusCode());
717 responseBuilder.setAckFinalIndicator(ackFinal);
718 trySetResponseMessage(responseBuilder, responseObject);
719 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
720 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
722 RpcResult<ServiceTopologyOperationOutput> rpcResult = RpcResultBuilder
723 .<ServiceTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
725 return Futures.immediateFuture(rpcResult);
728 private void trySetResponseMessage(ServiceTopologyOperationOutputBuilder responseBuilder,
729 ResponseObject responseObject) {
730 if (responseObject.getMessage() != null) {
731 responseBuilder.setResponseMessage(responseObject.getMessage());
735 private boolean hasInvalidServiceId(ServiceTopologyOperationInput input) {
736 return input == null || input.getServiceInformation() == null
737 || input.getServiceInformation().getServiceInstanceId() == null
738 || input.getServiceInformation().getServiceInstanceId().length() == 0;
741 private void trySetSvcRequestId(ServiceTopologyOperationInput input,
742 ServiceTopologyOperationOutputBuilder responseBuilder) {
743 if (input.getSdncRequestHeader() != null) {
744 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
748 private void tryDeleteService(ServiceTopologyOperationInput input, ServiceBuilder serviceBuilder) {
749 if (isValidRequest(input) && input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete)) {
750 // Only update operational tree on delete
751 log.info("Delete from both CONFIGURATION and OPERATIONAL tree.");
752 deleteService(serviceBuilder.build(), LogicalDatastoreType.OPERATIONAL);
753 deleteService(serviceBuilder.build(), LogicalDatastoreType.CONFIGURATION);
757 private Properties tryGetProperties(String svcOperation, Properties parms, ServiceDataBuilder serviceDataBuilder,
758 ResponseObject responseObject) {
760 if (svcLogicClient.hasGraph(APP_NAME, svcOperation, null, "sync")) {
762 return svcLogicClient.execute(APP_NAME, svcOperation, null, "sync", serviceDataBuilder, parms);
763 } catch (Exception e) {
764 log.error(SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE, svcOperation, e);
765 responseObject.setMessage(e.getMessage());
766 responseObject.setStatusCode("500");
769 responseObject.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
770 responseObject.setStatusCode("503");
772 } catch (Exception e) {
773 responseObject.setMessage(e.getMessage());
774 responseObject.setStatusCode("500");
775 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
781 private boolean failed(ResponseObject error) {
782 return !error.getStatusCode().isEmpty()
783 && !("0".equals(error.getStatusCode()) || "200".equals(error.getStatusCode()));
786 private boolean isValidRequest(ServiceTopologyOperationInput input) {
787 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
792 public ListenableFuture<RpcResult<PnfTopologyOperationOutput>> pnfTopologyOperation(
793 PnfTopologyOperationInput input) {
795 final String svcOperation = "pnf-topology-operation";
796 ServiceData serviceData;
797 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
798 Properties properties = new Properties();
800 log.info(CALLED_STR, svcOperation);
801 // create a new response object
802 PnfTopologyOperationOutputBuilder responseBuilder = new PnfTopologyOperationOutputBuilder();
804 if (hasInvalidServiceId(input)) {
805 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
806 responseBuilder.setResponseCode("404");
807 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
808 responseBuilder.setAckFinalIndicator("Y");
809 RpcResult<PnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<PnfTopologyOperationOutput>status(true)
810 .withResult(responseBuilder.build()).build();
812 return Futures.immediateFuture(rpcResult);
815 // Grab the service instance ID from the input buffer
816 String siid = input.getServiceInformation().getServiceInstanceId();
818 trySetSvcRequestId(input, responseBuilder);
820 /* Comment out mandatory check for pnf id for scenario wherein for assign/create request pnf-id is generated by
822 if (hasInvalidPnfId(input)) {
823 log.debug("exiting {} because of null or empty pnf-id", svcOperation);
824 responseBuilder.setResponseCode("404");
825 responseBuilder.setResponseMessage("invalid input, null or empty pnf-id");
826 responseBuilder.setAckFinalIndicator("Y");
828 RpcResult<PnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<PnfTopologyOperationOutput>status(true)
829 .withResult(responseBuilder.build()).build();
831 return Futures.immediateFuture(rpcResult);
835 String pnfId = input.getPnfDetails().getPnfId();
836 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
837 getServiceData(siid, serviceDataBuilder);
839 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
840 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
842 // Set the serviceStatus based on input
843 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
844 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
847 // setup a service-data object builder
848 // ACTION pnf-topology-operation
850 // USES sdnc-request-header;
851 // USES request-information;
852 // USES service-information;
855 // USES pnf-topology-response-body;
857 // USES service-information
861 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
862 PnfTopologyOperationInputBuilder inputBuilder = new PnfTopologyOperationInputBuilder(input);
863 GenericResourceApiUtil.toProperties(properties, inputBuilder.build());
865 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
866 GenericResourceApiUtil.toProperties(properties, OPERATIONAL_DATA_PARAM, operDataBuilder);
868 // Call SLI sync method
870 ResponseObject responseObject = new ResponseObject("200", "");
871 String ackFinal = "Y";
872 String serviceObjectPath = null;
873 String pnfObjectPath = null;
874 Properties respProps = tryGetProperties(svcOperation, properties, serviceDataBuilder, responseObject);
876 if (respProps != null) {
877 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
878 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
879 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
881 pnfId = respProps.getProperty("pnfId");
883 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
884 pnfObjectPath = respProps.getProperty(PNF_OBJECT_PATH_PARAM);
887 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
888 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
889 serviceStatusBuilder.setRpcName(svcOperation);
891 if (failed(responseObject)) {
892 responseBuilder.setResponseCode(responseObject.getStatusCode());
893 responseBuilder.setResponseMessage(responseObject.getMessage());
894 responseBuilder.setAckFinalIndicator(ackFinal);
896 ServiceBuilder serviceBuilder = new ServiceBuilder();
897 serviceBuilder.setServiceInstanceId(siid);
898 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
900 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
901 trySaveService(input, serviceBuilder);
902 } catch (Exception e) {
903 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
905 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
907 RpcResult<PnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<PnfTopologyOperationOutput>status(true)
908 .withResult(responseBuilder.build()).build();
911 return Futures.immediateFuture(rpcResult);
914 // Got success from SLI
916 serviceData = serviceDataBuilder.build();
917 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
920 ServiceBuilder serviceBuilder = new ServiceBuilder();
921 serviceBuilder.setServiceData(serviceData);
922 serviceBuilder.setServiceInstanceId(siid);
923 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
924 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
926 if (isValidRequest(input) && input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)) {
927 // Only update operational tree on Assign
928 log.info(UPDATING_TREE_INFO_MESSAGE);
929 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
932 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
933 serviceResponseInformationBuilder.setInstanceId(siid);
934 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
935 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
937 PnfResponseInformationBuilder pnfResponseInformationBuilder = new PnfResponseInformationBuilder();
938 pnfResponseInformationBuilder.setInstanceId(pnfId);
939 pnfResponseInformationBuilder.setObjectPath(pnfObjectPath);
940 responseBuilder.setPnfResponseInformation(pnfResponseInformationBuilder.build());
942 } catch (Exception e) {
943 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
944 responseBuilder.setResponseCode("500");
945 responseBuilder.setResponseMessage(e.getMessage());
946 responseBuilder.setAckFinalIndicator("Y");
947 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
949 RpcResult<PnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<PnfTopologyOperationOutput>status(true)
950 .withResult(responseBuilder.build()).build();
952 return Futures.immediateFuture(rpcResult);
956 responseBuilder.setResponseCode(responseObject.getStatusCode());
957 responseBuilder.setAckFinalIndicator(ackFinal);
958 trySetResponseMessage(responseBuilder, responseObject);
959 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
960 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
962 RpcResult<PnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<PnfTopologyOperationOutput>status(true)
963 .withResult(responseBuilder.build()).build();
966 return Futures.immediateFuture(rpcResult);
969 private void trySetResponseMessage(PnfTopologyOperationOutputBuilder responseBuilder,
970 ResponseObject responseObject) {
971 if (responseObject.getMessage() != null) {
972 responseBuilder.setResponseMessage(responseObject.getMessage());
976 private void trySaveService(PnfTopologyOperationInput input, ServiceBuilder serviceBuilder) {
977 if (isValidRequest(input) && (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete)
978 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
980 // Only update operational tree on activate or delete
981 log.info(UPDATING_TREE_INFO_MESSAGE);
982 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
986 private boolean hasInvalidPnfId(PnfTopologyOperationInput input) {
987 return input.getPnfDetails() == null || input.getPnfDetails().getPnfId() == null
988 || input.getPnfDetails().getPnfId().length() == 0;
991 private boolean hasInvalidServiceId(PnfTopologyOperationInput input) {
992 return input == null || input.getServiceInformation() == null
993 || input.getServiceInformation().getServiceInstanceId() == null
994 || input.getServiceInformation().getServiceInstanceId().length() == 0;
997 private void trySetSvcRequestId(PnfTopologyOperationInput input,
998 PnfTopologyOperationOutputBuilder responseBuilder) {
999 if (input.getSdncRequestHeader() != null) {
1000 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1004 private boolean isValidRequest(PnfTopologyOperationInput input) {
1005 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
1010 public ListenableFuture<RpcResult<VnfTopologyOperationOutput>> vnfTopologyOperation(
1011 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 String skipMdsalUpdate = null;
1095 Properties respProps = tryGetProperties(svcOperation, properties, serviceDataBuilder, responseObject);
1097 if (respProps != null) {
1098 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1099 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1100 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1101 if (vnfId == null) {
1102 vnfId = respProps.getProperty("vnfId");
1104 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1105 vnfObjectPath = respProps.getProperty(VNF_OBJECT_PATH_PARAM);
1106 skipMdsalUpdate = respProps.getProperty(SKIP_MDSAL_UPDATE_PROP);
1107 log.info("skipMdsalUpdate originally is " + skipMdsalUpdate);
1108 if (skipMdsalUpdate == null) {
1109 skipMdsalUpdate = "N";
1111 log.info("skipMdsalUpdate is " + skipMdsalUpdate);
1114 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
1115 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
1116 serviceStatusBuilder.setRpcName(svcOperation);
1118 if (failed(responseObject)) {
1119 responseBuilder.setResponseCode(responseObject.getStatusCode());
1120 responseBuilder.setResponseMessage(responseObject.getMessage());
1121 responseBuilder.setAckFinalIndicator(ackFinal);
1123 ServiceBuilder serviceBuilder = new ServiceBuilder();
1124 serviceBuilder.setServiceInstanceId(siid);
1125 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1127 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
1128 trySaveService(input, serviceBuilder);
1129 } catch (Exception e) {
1130 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1132 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1134 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<VnfTopologyOperationOutput>status(true)
1135 .withResult(responseBuilder.build()).build();
1138 return Futures.immediateFuture(rpcResult);
1141 // Got success from SLI
1143 if (skipMdsalUpdate.equals("N")) {
1144 serviceData = serviceDataBuilder.build();
1145 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
1148 ServiceBuilder serviceBuilder = new ServiceBuilder();
1149 serviceBuilder.setServiceData(serviceData);
1150 serviceBuilder.setServiceInstanceId(siid);
1151 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1152 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1154 if (isValidRequest(input) && input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)) {
1155 // Only update operational tree on Assign
1156 log.info(UPDATING_TREE_INFO_MESSAGE);
1157 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1160 // Even if we are skipping the MD-SAL update, update the service status object
1161 ServiceBuilder serviceBuilder = new ServiceBuilder();
1162 serviceBuilder.setServiceInstanceId(siid);
1163 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1164 Service service = serviceBuilder.build();
1165 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, service);
1166 saveService(service, true, LogicalDatastoreType.CONFIGURATION);
1169 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1170 serviceResponseInformationBuilder.setInstanceId(siid);
1171 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1172 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1174 VnfResponseInformationBuilder vnfResponseInformationBuilder = new VnfResponseInformationBuilder();
1175 vnfResponseInformationBuilder.setInstanceId(vnfId);
1176 vnfResponseInformationBuilder.setObjectPath(vnfObjectPath);
1177 responseBuilder.setVnfResponseInformation(vnfResponseInformationBuilder.build());
1179 } catch (Exception e) {
1180 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1181 responseBuilder.setResponseCode("500");
1182 responseBuilder.setResponseMessage(e.getMessage());
1183 responseBuilder.setAckFinalIndicator("Y");
1184 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1186 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<VnfTopologyOperationOutput>status(true)
1187 .withResult(responseBuilder.build()).build();
1189 return Futures.immediateFuture(rpcResult);
1193 responseBuilder.setResponseCode(responseObject.getStatusCode());
1194 responseBuilder.setAckFinalIndicator(ackFinal);
1195 trySetResponseMessage(responseBuilder, responseObject);
1196 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
1197 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
1199 RpcResult<VnfTopologyOperationOutput> rpcResult = RpcResultBuilder.<VnfTopologyOperationOutput>status(true)
1200 .withResult(responseBuilder.build()).build();
1202 if (ackFinal.equals("N")) {
1203 // Spawn background thread to invoke the Async DG
1204 Runnable backgroundThread = new Runnable() {
1206 log.info(BACKGROUND_THREAD_STARTED_MESSAGE);
1207 processAsyncVnfTopologyOperation(input);
1210 new Thread(backgroundThread).start();
1214 return Futures.immediateFuture(rpcResult);
1217 private void trySetResponseMessage(VnfTopologyOperationOutputBuilder responseBuilder,
1218 ResponseObject responseObject) {
1219 if (responseObject.getMessage() != null) {
1220 responseBuilder.setResponseMessage(responseObject.getMessage());
1224 private void trySaveService(VnfTopologyOperationInput input, ServiceBuilder serviceBuilder) {
1225 if (isValidRequest(input) && (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete)
1226 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
1228 // Only update operational tree on activate or delete
1229 log.info(UPDATING_TREE_INFO_MESSAGE);
1230 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1234 private boolean hasInvalidVnfId(VnfTopologyOperationInput input) {
1235 return input.getVnfInformation() == null || input.getVnfInformation().getVnfId() == null
1236 || input.getVnfInformation().getVnfId().length() == 0;
1239 private boolean hasInvalidServiceId(VnfTopologyOperationInput input) {
1240 return input == null || input.getServiceInformation() == null
1241 || input.getServiceInformation().getServiceInstanceId() == null
1242 || input.getServiceInformation().getServiceInstanceId().length() == 0;
1245 private void trySetSvcRequestId(VnfTopologyOperationInput input,
1246 VnfTopologyOperationOutputBuilder responseBuilder) {
1247 if (input.getSdncRequestHeader() != null) {
1248 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1252 private boolean isValidRequest(VnfTopologyOperationInput input) {
1253 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
1256 public void processAsyncVnfTopologyOperation(VnfTopologyOperationInput input) {
1257 log.info(BACKGROUND_THREAD_INFO, input.getVnfInformation().getVnfId());
1259 final String svcOperation = "vnf-topology-operation-async";
1260 ServiceData serviceData = null;
1261 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1262 Properties parms = new Properties();
1264 log.info(CALLED_STR, svcOperation);
1266 // create a new response object (for logging purposes only)
1267 VnfTopologyOperationOutputBuilder responseBuilder = new VnfTopologyOperationOutputBuilder();
1269 // Grab the service instance ID from the input buffer
1270 String siid = input.getServiceInformation().getServiceInstanceId();
1271 String vnfId = input.getVnfInformation().getVnfId();
1273 trySetSvcRequestId(input, responseBuilder);
1275 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1276 getServiceData(siid, serviceDataBuilder);
1278 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
1279 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
1281 // Set the serviceStatus based on input
1282 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
1283 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
1286 // setup a service-data object builder
1287 // ACTION vnf-topology-operation
1289 // USES sdnc-request-header;
1290 // USES request-information;
1291 // USES service-information;
1292 // USES vnf-request-information
1294 // USES vnf-topology-response-body;
1295 // USES vnf-information
1296 // USES service-information
1298 // container service-data
1299 // uses vnf-configuration-information;
1300 // uses oper-status;
1302 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
1303 VnfTopologyOperationInputBuilder inputBuilder = new VnfTopologyOperationInputBuilder(input);
1304 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1306 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
1307 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
1309 // Call SLI sync method
1311 ResponseObject responseObject = new ResponseObject("200", "");
1312 String ackFinal = "Y";
1313 String serviceObjectPath = null;
1314 String vnfObjectPath = null;
1315 String skipMdsalUpdate = null;
1316 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
1318 if (respProps != null) {
1319 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1320 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1321 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1322 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1323 vnfObjectPath = respProps.getProperty(VNF_OBJECT_PATH_PARAM);
1324 skipMdsalUpdate = respProps.getProperty(SKIP_MDSAL_UPDATE_PROP);
1325 if (skipMdsalUpdate == null) {
1326 skipMdsalUpdate = "N";
1330 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
1331 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
1332 serviceStatusBuilder.setRpcName(svcOperation);
1334 if (failed(responseObject)) {
1335 responseBuilder.setResponseCode(responseObject.getStatusCode());
1336 responseBuilder.setResponseMessage(responseObject.getMessage());
1337 responseBuilder.setAckFinalIndicator(ackFinal);
1339 ServiceBuilder serviceBuilder = new ServiceBuilder();
1340 serviceBuilder.setServiceInstanceId(siid);
1341 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1343 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
1344 } catch (Exception e) {
1345 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1347 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1351 // Got success from SLI
1353 if (skipMdsalUpdate.equals("N")) {
1354 serviceData = serviceDataBuilder.build();
1355 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
1358 ServiceBuilder serviceBuilder = new ServiceBuilder();
1359 serviceBuilder.setServiceData(serviceData);
1360 serviceBuilder.setServiceInstanceId(siid);
1361 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1362 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1364 trySaveService(input, serviceBuilder);
1366 // Even if we are skipping the MD-SAL update, update the service status object
1367 ServiceBuilder serviceBuilder = new ServiceBuilder();
1368 serviceBuilder.setServiceInstanceId(siid);
1369 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1370 Service service = serviceBuilder.build();
1371 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, service);
1372 saveService(service, true, LogicalDatastoreType.CONFIGURATION);
1375 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1376 serviceResponseInformationBuilder.setInstanceId(siid);
1377 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1378 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1380 VnfResponseInformationBuilder vnfResponseInformationBuilder = new VnfResponseInformationBuilder();
1381 vnfResponseInformationBuilder.setInstanceId(vnfId);
1382 vnfResponseInformationBuilder.setObjectPath(vnfObjectPath);
1383 responseBuilder.setVnfResponseInformation(vnfResponseInformationBuilder.build());
1385 } catch (Exception e) {
1386 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1387 responseBuilder.setResponseCode("500");
1388 responseBuilder.setResponseMessage(e.getMessage());
1389 responseBuilder.setAckFinalIndicator("Y");
1390 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1396 responseBuilder.setResponseCode(responseObject.getStatusCode());
1397 responseBuilder.setAckFinalIndicator(ackFinal);
1398 trySetResponseMessage(responseBuilder, responseObject);
1399 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
1400 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
1405 public ListenableFuture<RpcResult<VfModuleTopologyOperationOutput>> vfModuleTopologyOperation(
1406 VfModuleTopologyOperationInput input) {
1408 final String svcOperation = "vf-module-topology-operation";
1409 ServiceData serviceData;
1410 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1411 Properties parms = new Properties();
1413 log.info(CALLED_STR, svcOperation);
1414 // create a new response object
1415 VfModuleTopologyOperationOutputBuilder responseBuilder = new VfModuleTopologyOperationOutputBuilder();
1417 if (hasInvalidServiceId(input)) {
1418 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
1419 responseBuilder.setResponseCode("403");
1420 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
1421 responseBuilder.setAckFinalIndicator("Y");
1423 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1424 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1427 return Futures.immediateFuture(rpcResult);
1430 if (hasInvalidVnfId(input)) {
1431 log.debug("exiting {} because of null or empty vnf-id", svcOperation);
1432 responseBuilder.setResponseCode("403");
1433 responseBuilder.setResponseMessage("invalid input, null or empty vnf-id");
1434 responseBuilder.setAckFinalIndicator("Y");
1435 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1436 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1437 return Futures.immediateFuture(rpcResult);
1440 /*if (hasInvalidVfModuleId(input)) {
1441 log.debug("exiting {} because of null or empty vf-module-id", svcOperation);
1442 responseBuilder.setResponseCode("403");
1443 responseBuilder.setResponseMessage("invalid input, vf-module-id is null or empty");
1444 responseBuilder.setAckFinalIndicator("Y");
1446 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1447 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1449 return Futures.immediateFuture(rpcResult);
1452 // Grab the service instance ID from the input buffer
1453 String siid = input.getServiceInformation().getServiceInstanceId();
1454 String vnfId = input.getVnfInformation().getVnfId();
1455 String vfModuleId = input.getVfModuleInformation().getVfModuleId();
1457 trySetSvcRequestId(input, responseBuilder);
1459 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1460 getServiceData(siid, serviceDataBuilder);
1462 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
1463 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
1465 // Set the serviceStatus based on input
1466 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
1467 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
1470 // setup a service-data object builder
1471 // ACTION vnf-topology-operation
1473 // USES sdnc-request-header;
1474 // USES request-information;
1475 // USES service-information;
1476 // USES vnf-request-information
1478 // USES vnf-topology-response-body;
1479 // USES vnf-information
1480 // USES service-information
1482 // container service-data
1483 // uses vnf-configuration-information;
1484 // uses oper-status;
1486 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
1487 VfModuleTopologyOperationInputBuilder inputBuilder = new VfModuleTopologyOperationInputBuilder(input);
1488 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1490 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
1491 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
1493 // Call SLI sync method
1495 ResponseObject responseObject = new ResponseObject("200", "");
1496 String ackFinal = "Y";
1497 String serviceObjectPath = null;
1498 String vnfObjectPath = null;
1499 String vfModuleObjectPath = null;
1500 String skipMdsalUpdate = null;
1501 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
1503 if (respProps != null) {
1504 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1505 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1506 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1507 if (vfModuleId == null) {
1508 vfModuleId = respProps.getProperty(VF_MODULE_ID_PARAM);
1509 if (vfModuleId == null) {
1510 log.debug("exiting {} because vf-module-id not found in response", svcOperation);
1511 responseBuilder.setResponseCode("403");
1512 responseBuilder.setResponseMessage("failed to generate vf-module-id");
1513 responseBuilder.setAckFinalIndicator("Y");
1515 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1516 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1518 return Futures.immediateFuture(rpcResult);
1521 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1522 vnfObjectPath = respProps.getProperty(VNF_OBJECT_PATH_PARAM);
1523 vfModuleObjectPath = respProps.getProperty(VF_MODULE_OBJECT_PATH_PARAM);
1524 skipMdsalUpdate = respProps.getProperty(SKIP_MDSAL_UPDATE_PROP);
1525 if (skipMdsalUpdate == null) {
1526 skipMdsalUpdate = "N";
1530 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
1531 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
1532 serviceStatusBuilder.setRpcName(svcOperation);
1534 if (failed(responseObject)) {
1535 responseBuilder.setResponseCode(responseObject.getStatusCode());
1536 responseBuilder.setResponseMessage(responseObject.getMessage());
1537 responseBuilder.setAckFinalIndicator(ackFinal);
1539 ServiceBuilder serviceBuilder = new ServiceBuilder();
1540 serviceBuilder.setServiceInstanceId(siid);
1541 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1543 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
1544 } catch (Exception e) {
1545 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1547 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1549 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1550 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1553 return Futures.immediateFuture(rpcResult);
1556 // Got success from SLI
1558 if (skipMdsalUpdate.equals("N")) {
1559 serviceData = serviceDataBuilder.build();
1560 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
1563 ServiceBuilder serviceBuilder = new ServiceBuilder();
1564 serviceBuilder.setServiceData(serviceData);
1565 serviceBuilder.setServiceInstanceId(siid);
1566 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1567 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1569 trySaveService(input, serviceBuilder);
1571 // Even if we are skipping the MD-SAL update, update the service status object
1572 ServiceBuilder serviceBuilder = new ServiceBuilder();
1573 serviceBuilder.setServiceInstanceId(siid);
1574 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1575 Service service = serviceBuilder.build();
1576 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, service);
1577 saveService(service, true, LogicalDatastoreType.CONFIGURATION);
1580 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1581 serviceResponseInformationBuilder.setInstanceId(siid);
1582 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1583 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1585 VnfResponseInformationBuilder vnfResponseInformationBuilder = new VnfResponseInformationBuilder();
1586 vnfResponseInformationBuilder.setInstanceId(vnfId);
1587 vnfResponseInformationBuilder.setObjectPath(vnfObjectPath);
1588 responseBuilder.setVnfResponseInformation(vnfResponseInformationBuilder.build());
1590 VfModuleResponseInformationBuilder vfModuleResponseInformationBuilder = new VfModuleResponseInformationBuilder();
1591 vfModuleResponseInformationBuilder.setInstanceId(vfModuleId);
1592 vfModuleResponseInformationBuilder.setObjectPath(vfModuleObjectPath);
1593 responseBuilder.setVfModuleResponseInformation(vfModuleResponseInformationBuilder.build());
1595 } catch (Exception e) {
1596 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1597 responseBuilder.setResponseCode("500");
1598 responseBuilder.setResponseMessage(e.getMessage());
1599 responseBuilder.setAckFinalIndicator("Y");
1600 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1602 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1603 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1605 return Futures.immediateFuture(rpcResult);
1609 responseBuilder.setResponseCode(responseObject.getStatusCode());
1610 responseBuilder.setAckFinalIndicator(ackFinal);
1611 trySetResponseMessage(responseBuilder, responseObject);
1612 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
1613 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
1615 RpcResult<VfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
1616 .<VfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1618 if (ackFinal.equals("N")) {
1619 // Spawn background thread to invoke the Async DG
1620 Runnable backgroundThread = new Runnable() {
1622 log.info(BACKGROUND_THREAD_STARTED_MESSAGE);
1623 processAsyncVfModuleTopologyOperation(input);
1626 new Thread(backgroundThread).start();
1630 return Futures.immediateFuture(rpcResult);
1633 private void trySetResponseMessage(VfModuleTopologyOperationOutputBuilder responseBuilder,
1634 ResponseObject responseObject) {
1635 if (responseObject.getMessage() != null) {
1636 responseBuilder.setResponseMessage(responseObject.getMessage());
1640 private void trySaveService(VfModuleTopologyOperationInput input, ServiceBuilder serviceBuilder) {
1641 if (isValidRequest(input) && (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign)
1642 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
1643 // Only update operational tree on activate or delete
1645 log.info(UPDATING_TREE_INFO_MESSAGE);
1646 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1650 private void trySetSvcRequestId(VfModuleTopologyOperationInput input,
1651 VfModuleTopologyOperationOutputBuilder responseBuilder) {
1652 if (input.getSdncRequestHeader() != null) {
1653 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1657 private boolean hasInvalidVfModuleId(VfModuleTopologyOperationInput input) {
1658 return input.getVfModuleInformation() == null || input.getVfModuleInformation().getVfModuleId() == null
1659 || input.getVfModuleInformation().getVfModuleId().length() == 0;
1662 private boolean hasInvalidVnfId(VfModuleTopologyOperationInput input) {
1663 return input.getVnfInformation() == null || input.getVnfInformation().getVnfId() == null
1664 || input.getVnfInformation().getVnfId().length() == 0;
1667 private boolean hasInvalidServiceId(VfModuleTopologyOperationInput input) {
1668 return input == null || input.getServiceInformation() == null
1669 || input.getServiceInformation().getServiceInstanceId() == null
1670 || input.getServiceInformation().getServiceInstanceId().length() == 0;
1673 private boolean isValidRequest(VfModuleTopologyOperationInput input) {
1674 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
1677 public void processAsyncVfModuleTopologyOperation(VfModuleTopologyOperationInput input) {
1678 log.info(BACKGROUND_THREAD_INFO, input.getVfModuleInformation().getVfModuleId());
1680 final String svcOperation = "vf-module-topology-operation-async";
1681 ServiceData serviceData = null;
1682 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1683 Properties parms = new Properties();
1685 log.info(CALLED_STR, svcOperation);
1687 // create a new response object (for logging purposes only)
1688 VfModuleTopologyOperationOutputBuilder responseBuilder = new VfModuleTopologyOperationOutputBuilder();
1690 // Grab the service instance ID from the input buffer
1691 String siid = input.getServiceInformation().getServiceInstanceId();
1692 String vnfId = input.getVnfInformation().getVnfId();
1693 String vfModuleId = input.getVfModuleInformation().getVfModuleId();
1695 trySetSvcRequestId(input, responseBuilder);
1697 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1698 getServiceData(siid, serviceDataBuilder);
1700 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
1701 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
1703 // Set the serviceStatus based on input
1704 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
1705 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
1708 // setup a service-data object builder
1709 // ACTION vnf-topology-operation
1711 // USES sdnc-request-header;
1712 // USES request-information;
1713 // USES service-information;
1714 // USES vnf-request-information
1716 // USES vnf-topology-response-body;
1717 // USES vnf-information
1718 // USES service-information
1720 // container service-data
1721 // uses vnf-configuration-information;
1722 // uses oper-status;
1724 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
1725 VfModuleTopologyOperationInputBuilder inputBuilder = new VfModuleTopologyOperationInputBuilder(input);
1726 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1728 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
1729 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
1731 // Call SLI sync method
1733 ResponseObject responseObject = new ResponseObject("200", "");
1734 String ackFinal = "Y";
1735 String serviceObjectPath = null;
1736 String vnfObjectPath = null;
1737 String vfModuleObjectPath = null;
1738 String skipMdsalUpdate = null;
1739 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
1741 if (respProps != null) {
1742 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1743 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1744 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1745 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1746 vnfObjectPath = respProps.getProperty(VNF_OBJECT_PATH_PARAM);
1747 vfModuleObjectPath = respProps.getProperty(VF_MODULE_OBJECT_PATH_PARAM);
1748 skipMdsalUpdate = respProps.getProperty(SKIP_MDSAL_UPDATE_PROP);
1749 if (skipMdsalUpdate == null) {
1750 skipMdsalUpdate = "N";
1754 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
1755 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
1756 serviceStatusBuilder.setRpcName(svcOperation);
1758 if (failed(responseObject)) {
1759 responseBuilder.setResponseCode(responseObject.getStatusCode());
1760 responseBuilder.setResponseMessage(responseObject.getMessage());
1761 responseBuilder.setAckFinalIndicator(ackFinal);
1763 ServiceBuilder serviceBuilder = new ServiceBuilder();
1764 serviceBuilder.setServiceInstanceId(siid);
1765 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1767 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
1768 } catch (Exception e) {
1769 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1771 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1775 // Got success from SLI
1777 if (skipMdsalUpdate.equals("N")) {
1778 serviceData = serviceDataBuilder.build();
1779 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
1782 ServiceBuilder serviceBuilder = new ServiceBuilder();
1783 serviceBuilder.setServiceData(serviceData);
1784 serviceBuilder.setServiceInstanceId(siid);
1785 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1786 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1788 trySaveService(input, serviceBuilder);
1790 // Even if we are skipping the MD-SAL update, update the service status object
1791 ServiceBuilder serviceBuilder = new ServiceBuilder();
1792 serviceBuilder.setServiceInstanceId(siid);
1793 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1794 Service service = serviceBuilder.build();
1795 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, service);
1796 saveService(service, true, LogicalDatastoreType.CONFIGURATION);
1799 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1800 serviceResponseInformationBuilder.setInstanceId(siid);
1801 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1802 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1804 VnfResponseInformationBuilder vnfResponseInformationBuilder = new VnfResponseInformationBuilder();
1805 vnfResponseInformationBuilder.setInstanceId(vnfId);
1806 vnfResponseInformationBuilder.setObjectPath(vnfObjectPath);
1807 responseBuilder.setVnfResponseInformation(vnfResponseInformationBuilder.build());
1809 VfModuleResponseInformationBuilder vfModuleResponseInformationBuilder = new VfModuleResponseInformationBuilder();
1810 vfModuleResponseInformationBuilder.setInstanceId(vfModuleId);
1811 vfModuleResponseInformationBuilder.setObjectPath(vfModuleObjectPath);
1812 responseBuilder.setVfModuleResponseInformation(vfModuleResponseInformationBuilder.build());
1814 } catch (Exception e) {
1815 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1816 responseBuilder.setResponseCode("500");
1817 responseBuilder.setResponseMessage(e.getMessage());
1818 responseBuilder.setAckFinalIndicator("Y");
1819 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1825 responseBuilder.setResponseCode(responseObject.getStatusCode());
1826 responseBuilder.setAckFinalIndicator(ackFinal);
1827 trySetResponseMessage(responseBuilder, responseObject);
1828 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
1829 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
1834 public ListenableFuture<RpcResult<NetworkTopologyOperationOutput>> networkTopologyOperation(
1835 NetworkTopologyOperationInput input) {
1837 final String svcOperation = "network-topology-operation";
1838 ServiceData serviceData;
1839 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
1840 Properties parms = new Properties();
1842 log.info(CALLED_STR, svcOperation);
1843 // create a new response object
1844 NetworkTopologyOperationOutputBuilder responseBuilder = new NetworkTopologyOperationOutputBuilder();
1846 if (hasInvalidServiceId(input)) {
1847 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
1848 return buildRpcResultFuture(responseBuilder, NULL_OR_EMPTY_ERROR_PARAM);
1851 String siid = input.getServiceInformation().getServiceInstanceId();
1853 // Get the service-instance service data from MD-SAL
1854 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
1855 getServiceData(siid, serviceDataBuilder);
1857 this.trySetSvcRequestId(input, responseBuilder);
1859 ServiceData sd = serviceDataBuilder.build();
1860 if (isInvalidServiceData(sd)) {
1861 log.debug(EMPTY_SERVICE_INSTANCE_MESSAGE, svcOperation);
1862 return buildRpcResultFuture(responseBuilder, INVALID_INPUT_ERROR_MESSAGE);
1865 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
1866 NetworkTopologyOperationInputBuilder inputBuilder = new NetworkTopologyOperationInputBuilder(input);
1867 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
1869 // Call SLI sync method
1871 ResponseObject responseObject = new ResponseObject("200", "");
1872 String ackFinal = "Y";
1873 String networkId = ERROR_NETWORK_ID;
1874 String serviceObjectPath = null;
1875 String networkObjectPath = null;
1876 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
1878 if (respProps != null) {
1879 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
1880 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
1881 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
1882 networkId = respProps.getProperty("networkId");
1883 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
1884 networkObjectPath = respProps.getProperty(NETWORK_OBJECT_PATH_PARAM);
1887 if (failed(responseObject)) {
1888 responseBuilder.setResponseCode(responseObject.getStatusCode());
1889 responseBuilder.setResponseMessage(responseObject.getMessage());
1890 responseBuilder.setAckFinalIndicator(ackFinal);
1892 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1894 RpcResult<NetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
1895 .<NetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1897 return Futures.immediateFuture(rpcResult);
1900 // Got success from SLI
1903 serviceData = serviceDataBuilder.build();
1904 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
1907 ServiceBuilder serviceBuilder = new ServiceBuilder();
1908 serviceBuilder.setServiceData(serviceData);
1909 serviceBuilder.setServiceInstanceId(siid);
1910 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
1911 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
1913 trySaveService(input, serviceBuilder);
1915 NetworkResponseInformationBuilder networkResponseInformationBuilder = new NetworkResponseInformationBuilder();
1916 networkResponseInformationBuilder.setInstanceId(networkId);
1917 networkResponseInformationBuilder.setObjectPath(networkObjectPath);
1918 responseBuilder.setNetworkResponseInformation(networkResponseInformationBuilder.build());
1920 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
1921 serviceResponseInformationBuilder.setInstanceId(siid);
1922 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
1923 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
1925 } catch (IllegalStateException e) {
1926 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
1927 responseBuilder.setResponseCode("500");
1928 responseBuilder.setResponseMessage(e.getMessage());
1929 responseBuilder.setAckFinalIndicator("Y");
1930 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
1932 RpcResult<NetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
1933 .<NetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1935 return Futures.immediateFuture(rpcResult);
1939 responseBuilder.setResponseCode(responseObject.getStatusCode());
1940 responseBuilder.setAckFinalIndicator(ackFinal);
1941 trySetResponseMessage(responseBuilder, responseObject);
1942 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
1943 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
1945 RpcResult<NetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
1946 .<NetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1948 return Futures.immediateFuture(rpcResult);
1951 private void trySetResponseMessage(NetworkTopologyOperationOutputBuilder responseBuilder,
1952 ResponseObject responseObject) {
1953 if (responseObject.getMessage() != null) {
1954 responseBuilder.setResponseMessage(responseObject.getMessage());
1958 private void trySetSvcRequestId(NetworkTopologyOperationInput input,
1959 NetworkTopologyOperationOutputBuilder responseBuilder) {
1960 if (input.getSdncRequestHeader() != null) {
1961 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
1965 private void trySaveService(NetworkTopologyOperationInput input, ServiceBuilder serviceBuilder) {
1966 if (isValidRequest(input) && (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)
1967 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Create))) {
1968 // Only update operational tree on Activate
1969 log.info(UPDATING_TREE_INFO_MESSAGE);
1970 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
1974 private boolean hasInvalidServiceId(NetworkTopologyOperationInput input) {
1975 return input == null || input.getServiceInformation() == null
1976 || input.getServiceInformation().getServiceInstanceId() == null
1977 || input.getServiceInformation().getServiceInstanceId().length() == 0;
1980 private ListenableFuture<RpcResult<NetworkTopologyOperationOutput>> buildRpcResultFuture(
1981 NetworkTopologyOperationOutputBuilder responseBuilder, String responseMessage) {
1983 responseBuilder.setResponseCode("404");
1984 responseBuilder.setResponseMessage(responseMessage);
1985 responseBuilder.setAckFinalIndicator("Y");
1987 RpcResult<NetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
1988 .<NetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
1990 return Futures.immediateFuture(rpcResult);
1993 private boolean isValidRequest(NetworkTopologyOperationInput input) {
1994 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
1998 public ListenableFuture<RpcResult<ContrailRouteTopologyOperationOutput>> contrailRouteTopologyOperation(
1999 ContrailRouteTopologyOperationInput input) {
2001 final String svcOperation = "contrail-route-topology-operation";
2002 ServiceData serviceData;
2003 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
2004 Properties properties = new Properties();
2006 log.info(CALLED_STR, svcOperation);
2007 // create a new response object
2008 ContrailRouteTopologyOperationOutputBuilder responseBuilder = new ContrailRouteTopologyOperationOutputBuilder();
2010 if (hasInvalidServiceId(input)) {
2011 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
2012 return buildRpcResultFuture(responseBuilder, NULL_OR_EMPTY_ERROR_PARAM);
2015 String siid = input.getServiceInformation().getServiceInstanceId();
2017 // Get the service-instance service data from MD-SAL
2018 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
2019 getServiceData(siid, serviceDataBuilder);
2021 trySetSvcRequestId(input, responseBuilder);
2023 ServiceData sd = serviceDataBuilder.build();
2024 if (isInvalidServiceData(sd)) {
2025 log.debug(EMPTY_SERVICE_INSTANCE_MESSAGE, svcOperation);
2026 return buildRpcResultFuture(responseBuilder, INVALID_INPUT_ERROR_MESSAGE);
2029 log.info("Adding INPUT data for " + svcOperation + " [" + siid + "] input: " + input);
2030 ContrailRouteTopologyOperationInputBuilder inputBuilder = new ContrailRouteTopologyOperationInputBuilder(input);
2031 GenericResourceApiUtil.toProperties(properties, inputBuilder.build());
2033 // Call SLI sync method
2035 ResponseObject responseObject = new ResponseObject("200", "");
2036 String ackFinal = "Y";
2037 String allottedResourceId = ERROR_NETWORK_ID;
2038 String serviceObjectPath = null;
2039 String contrailRouteObjectPath = null;
2040 Properties respProps = tryGetProperties(svcOperation, properties, serviceDataBuilder, responseObject);
2042 if (respProps != null) {
2043 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2044 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2045 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2046 allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
2047 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
2048 contrailRouteObjectPath = respProps.getProperty("contrail-route-object-path");
2051 if (failed(responseObject)) {
2052 responseBuilder.setResponseCode(responseObject.getStatusCode());
2053 responseBuilder.setResponseMessage(responseObject.getMessage());
2054 responseBuilder.setAckFinalIndicator(ackFinal);
2055 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2057 RpcResult<ContrailRouteTopologyOperationOutput> rpcResult = RpcResultBuilder
2058 .<ContrailRouteTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2060 return Futures.immediateFuture(rpcResult);
2063 // Got success from SLI
2065 serviceData = serviceDataBuilder.build();
2066 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
2069 ServiceBuilder serviceBuilder = new ServiceBuilder();
2070 serviceBuilder.setServiceData(serviceData);
2071 serviceBuilder.setServiceInstanceId(siid);
2072 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
2073 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
2075 trySaveService(input, serviceBuilder);
2077 ContrailRouteResponseInformationBuilder contrailRouteResponseInformationBuilder = new ContrailRouteResponseInformationBuilder();
2078 contrailRouteResponseInformationBuilder.setInstanceId(allottedResourceId);
2079 contrailRouteResponseInformationBuilder.setObjectPath(contrailRouteObjectPath);
2080 responseBuilder.setContrailRouteResponseInformation(contrailRouteResponseInformationBuilder.build());
2082 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
2083 serviceResponseInformationBuilder.setInstanceId(siid);
2084 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
2085 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
2087 } catch (IllegalStateException e) {
2088 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
2089 responseBuilder.setResponseCode("500");
2090 responseBuilder.setResponseMessage(e.getMessage());
2091 responseBuilder.setAckFinalIndicator("Y");
2092 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2094 RpcResult<ContrailRouteTopologyOperationOutput> rpcResult = RpcResultBuilder
2095 .<ContrailRouteTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2097 return Futures.immediateFuture(rpcResult);
2101 responseBuilder.setResponseCode(responseObject.getStatusCode());
2102 responseBuilder.setAckFinalIndicator(ackFinal);
2103 trySetResponseMessage(responseBuilder, responseObject);
2104 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
2105 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
2107 RpcResult<ContrailRouteTopologyOperationOutput> rpcResult = RpcResultBuilder
2108 .<ContrailRouteTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2110 return Futures.immediateFuture(rpcResult);
2113 private void trySetResponseMessage(ContrailRouteTopologyOperationOutputBuilder responseBuilder,
2114 ResponseObject responseObject) {
2115 if (responseObject.getMessage() != null) {
2116 responseBuilder.setResponseMessage(responseObject.getMessage());
2120 private void trySaveService(ContrailRouteTopologyOperationInput input, ServiceBuilder serviceBuilder) {
2121 if (isValidRequest(input) && (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign)
2122 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
2123 // Only update operational tree on activate or delete
2124 log.info(UPDATING_TREE_INFO_MESSAGE);
2125 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
2129 private void trySetSvcRequestId(ContrailRouteTopologyOperationInput input,
2130 ContrailRouteTopologyOperationOutputBuilder responseBuilder) {
2131 if (input.getSdncRequestHeader() != null) {
2132 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
2136 private boolean hasInvalidServiceId(ContrailRouteTopologyOperationInput input) {
2137 return input == null || input.getServiceInformation() == null
2138 || input.getServiceInformation().getServiceInstanceId() == null
2139 || input.getServiceInformation().getServiceInstanceId().length() == 0;
2142 private ListenableFuture<RpcResult<ContrailRouteTopologyOperationOutput>> buildRpcResultFuture(
2143 ContrailRouteTopologyOperationOutputBuilder responseBuilder, String responseMessage) {
2144 responseBuilder.setResponseCode("404");
2145 responseBuilder.setResponseMessage(responseMessage);
2146 responseBuilder.setAckFinalIndicator("Y");
2148 RpcResult<ContrailRouteTopologyOperationOutput> rpcResult = RpcResultBuilder
2149 .<ContrailRouteTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2151 return Futures.immediateFuture(rpcResult);
2154 private boolean isValidRequest(ContrailRouteTopologyOperationInput input) {
2155 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
2159 public ListenableFuture<RpcResult<SecurityZoneTopologyOperationOutput>> securityZoneTopologyOperation(
2160 SecurityZoneTopologyOperationInput input) {
2162 final String svcOperation = "security-zone-topology-operation";
2163 ServiceData serviceData;
2164 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
2165 Properties parms = new Properties();
2167 log.info(CALLED_STR, svcOperation);
2168 // create a new response object
2169 SecurityZoneTopologyOperationOutputBuilder responseBuilder = new SecurityZoneTopologyOperationOutputBuilder();
2171 if (this.hasInvalidServiceId(input)) {
2172 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
2173 return buildRpcResultFuture(responseBuilder, NULL_OR_EMPTY_ERROR_PARAM);
2176 String siid = input.getServiceInformation().getServiceInstanceId();
2178 // Get the service-instance service data from MD-SAL
2179 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
2180 getServiceData(siid, serviceDataBuilder);
2181 trySetSvcRequestId(input, responseBuilder);
2183 ServiceData sd = serviceDataBuilder.build();
2184 if (isInvalidServiceData(sd)) {
2185 log.debug(EMPTY_SERVICE_INSTANCE_MESSAGE, svcOperation);
2186 return buildRpcResultFuture(responseBuilder, INVALID_INPUT_ERROR_MESSAGE);
2189 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
2190 SecurityZoneTopologyOperationInputBuilder inputBuilder = new SecurityZoneTopologyOperationInputBuilder(input);
2191 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
2193 // Call SLI sync method
2195 Properties respProps = null;
2197 ResponseObject responseObject = new ResponseObject("200", "");
2198 String ackFinal = "Y";
2199 String allottedResourceId = ERROR_NETWORK_ID;
2200 String serviceObjectPath = null;
2201 String securityZoneObjectPath = null;
2204 if (svcLogicClient.hasGraph(APP_NAME, svcOperation, null, "sync")) {
2207 respProps = svcLogicClient.execute(APP_NAME, svcOperation, null, "sync", serviceDataBuilder, parms);
2208 } catch (Exception e) {
2209 log.error(SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE, svcOperation, e);
2210 responseObject.setMessage(e.getMessage());
2211 responseObject.setStatusCode("500");
2214 responseObject.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
2215 responseObject.setStatusCode("503");
2217 } catch (Exception e) {
2218 responseObject.setStatusCode("500");
2219 responseObject.setMessage(e.getMessage());
2220 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
2223 if (respProps != null) {
2224 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2225 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2226 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2227 allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
2228 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
2229 securityZoneObjectPath = respProps.getProperty("security-zone-object-path");
2232 if (failed(responseObject)) {
2233 responseBuilder.setResponseCode(responseObject.getStatusCode());
2234 responseBuilder.setResponseMessage(responseObject.getMessage());
2235 responseBuilder.setAckFinalIndicator(ackFinal);
2236 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2238 RpcResult<SecurityZoneTopologyOperationOutput> rpcResult = RpcResultBuilder
2239 .<SecurityZoneTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2241 return Futures.immediateFuture(rpcResult);
2244 // Got success from SLI
2247 serviceData = serviceDataBuilder.build();
2248 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
2251 ServiceBuilder serviceBuilder = new ServiceBuilder();
2252 serviceBuilder.setServiceData(serviceData);
2253 serviceBuilder.setServiceInstanceId(siid);
2254 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
2255 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
2257 trySaveService(input, serviceBuilder);
2259 SecurityZoneResponseInformationBuilder securityZoneResponseInformationBuilder = new SecurityZoneResponseInformationBuilder();
2260 securityZoneResponseInformationBuilder.setInstanceId(allottedResourceId);
2261 securityZoneResponseInformationBuilder.setObjectPath(securityZoneObjectPath);
2262 responseBuilder.setSecurityZoneResponseInformation(securityZoneResponseInformationBuilder.build());
2264 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
2265 serviceResponseInformationBuilder.setInstanceId(siid);
2266 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
2267 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
2269 } catch (IllegalStateException e) {
2270 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
2271 responseBuilder.setResponseCode("500");
2272 responseBuilder.setResponseMessage(e.getMessage());
2273 responseBuilder.setAckFinalIndicator("Y");
2274 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2276 RpcResult<SecurityZoneTopologyOperationOutput> rpcResult = RpcResultBuilder
2277 .<SecurityZoneTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2279 return Futures.immediateFuture(rpcResult);
2283 responseBuilder.setResponseCode(responseObject.getStatusCode());
2284 responseBuilder.setAckFinalIndicator(ackFinal);
2285 trySetResponseMessage(responseBuilder, responseObject);
2286 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
2287 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
2289 RpcResult<SecurityZoneTopologyOperationOutput> rpcResult = RpcResultBuilder
2290 .<SecurityZoneTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2292 return Futures.immediateFuture(rpcResult);
2295 private void trySetResponseMessage(SecurityZoneTopologyOperationOutputBuilder responseBuilder,
2296 ResponseObject responseObject) {
2297 if (responseObject.getMessage() != null) {
2298 responseBuilder.setResponseMessage(responseObject.getMessage());
2302 private void trySaveService(SecurityZoneTopologyOperationInput input, ServiceBuilder serviceBuilder) {
2303 if (isValidRequest(input) && (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign)
2304 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
2305 // Only update operational tree on activate or delete
2306 log.info(UPDATING_TREE_INFO_MESSAGE);
2307 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
2311 private void trySetSvcRequestId(SecurityZoneTopologyOperationInput input,
2312 SecurityZoneTopologyOperationOutputBuilder responseBuilder) {
2313 if (input.getSdncRequestHeader() != null) {
2314 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
2318 private boolean isInvalidServiceData(ServiceData sd) {
2319 return sd == null || sd.getServiceLevelOperStatus() == null;
2322 private boolean hasInvalidServiceId(SecurityZoneTopologyOperationInput input) {
2323 return input == null || input.getServiceInformation() == null
2324 || input.getServiceInformation().getServiceInstanceId() == null
2325 || input.getServiceInformation().getServiceInstanceId().length() == 0;
2328 private ListenableFuture<RpcResult<SecurityZoneTopologyOperationOutput>> buildRpcResultFuture(
2329 SecurityZoneTopologyOperationOutputBuilder responseBuilder, String responseMessage) {
2331 responseBuilder.setResponseCode("404");
2332 responseBuilder.setResponseMessage(responseMessage);
2333 responseBuilder.setAckFinalIndicator("Y");
2335 RpcResult<SecurityZoneTopologyOperationOutput> rpcResult = RpcResultBuilder
2336 .<SecurityZoneTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2338 return Futures.immediateFuture(rpcResult);
2341 private boolean isValidRequest(SecurityZoneTopologyOperationInput input) {
2342 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
2346 private boolean hasInvalidServiceId(ConnectionAttachmentTopologyOperationInput input) {
2347 return input == null || input.getServiceInformation() == null
2348 || input.getServiceInformation().getServiceInstanceId() == null
2349 || input.getServiceInformation().getServiceInstanceId().length() == 0;
2352 private void trySetResponseMessage(ConnectionAttachmentTopologyOperationOutputBuilder responseBuilder,
2353 ResponseObject error) {
2354 if (!error.getMessage().isEmpty()) {
2355 responseBuilder.setResponseMessage(error.getMessage());
2359 private void trySetSvcRequestId(ConnectionAttachmentTopologyOperationInput input,
2360 ConnectionAttachmentTopologyOperationOutputBuilder responseBuilder) {
2361 if (input.getSdncRequestHeader() != null) {
2362 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
2366 private ListenableFuture<RpcResult<ConnectionAttachmentTopologyOperationOutput>>
2367 buildRpcResultFuture(ConnectionAttachmentTopologyOperationOutputBuilder responseBuilder, String responseMessage) {
2369 responseBuilder.setResponseCode("404");
2370 responseBuilder.setResponseMessage(responseMessage);
2371 responseBuilder.setAckFinalIndicator("Y");
2373 RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
2374 .<ConnectionAttachmentTopologyOperationOutput>status(true)
2375 .withResult(responseBuilder.build())
2378 return Futures.immediateFuture(rpcResult);
2381 private void trySaveService(ConnectionAttachmentTopologyOperationInput input, ServiceBuilder serviceBuilder) {
2382 if (isValidRequest(input) &&
2383 (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign) ||
2384 input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
2385 // Only update operational tree on activate or delete
2386 log.info(UPDATING_TREE_INFO_MESSAGE);
2387 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
2391 private boolean isValidRequest(ConnectionAttachmentTopologyOperationInput input) {
2392 return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
2396 public ListenableFuture<RpcResult<ConnectionAttachmentTopologyOperationOutput>> connectionAttachmentTopologyOperation(
2397 ConnectionAttachmentTopologyOperationInput input) {
2398 final String svcOperation = "connection-attachment-topology-operation";
2399 Properties parms = new Properties();
2400 log.info(CALLED_STR, svcOperation);
2402 // create a new response object
2403 ConnectionAttachmentTopologyOperationOutputBuilder responseBuilder = new ConnectionAttachmentTopologyOperationOutputBuilder();
2404 if (hasInvalidServiceId(input)) {
2405 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
2406 responseBuilder.setResponseCode("404");
2407 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
2408 responseBuilder.setAckFinalIndicator("Y");
2410 RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
2411 .<ConnectionAttachmentTopologyOperationOutput>status(true)
2412 .withResult(responseBuilder.build())
2415 return Futures.immediateFuture(rpcResult);
2418 ServiceData serviceData;
2419 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
2421 String siid = input.getServiceInformation().getServiceInstanceId();
2422 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
2424 // Get the service-instance service data from MD-SAL
2425 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
2426 getServiceData(siid, serviceDataBuilder);
2428 trySetSvcRequestId(input, responseBuilder);
2430 ServiceData sd = serviceDataBuilder.build();
2431 if (isInvalidServiceData(sd)) {
2432 log.debug(EMPTY_SERVICE_INSTANCE_MESSAGE, svcOperation);
2433 return buildRpcResultFuture(responseBuilder, INVALID_INPUT_ERROR_MESSAGE);
2436 ConnectionAttachmentTopologyOperationInputBuilder inputBuilder = new ConnectionAttachmentTopologyOperationInputBuilder(
2438 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
2440 // Call SLI sync method
2441 // Get SvcLogicService reference
2442 ResponseObject responseObject = new ResponseObject("200", "");
2443 String ackFinal = "Y";
2444 String allottedResourceId = ERROR_NETWORK_ID;
2445 String serviceObjectPath = null;
2446 String connectionAttachmentObjectPath = null;
2448 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
2450 if (respProps != null) {
2451 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2452 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2453 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2454 allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
2455 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
2456 connectionAttachmentObjectPath = respProps.getProperty("connection-attachment-object-path");
2459 if (failed(responseObject)) {
2460 responseBuilder.setResponseCode(responseObject.getStatusCode());
2461 responseBuilder.setResponseMessage(responseObject.getMessage());
2462 responseBuilder.setAckFinalIndicator(ackFinal);
2464 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2466 RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
2467 .<ConnectionAttachmentTopologyOperationOutput>status(true)
2468 .withResult(responseBuilder.build())
2471 return Futures.immediateFuture(rpcResult);
2474 // Got success from SLI
2477 serviceData = serviceDataBuilder.build();
2478 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
2481 ServiceBuilder serviceBuilder = new ServiceBuilder();
2482 serviceBuilder.setServiceData(serviceData);
2483 serviceBuilder.setServiceInstanceId(siid);
2484 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
2485 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
2487 trySaveService(input, serviceBuilder);
2489 ConnectionAttachmentResponseInformationBuilder connectionAttachmentResponseInformationBuilder = new ConnectionAttachmentResponseInformationBuilder();
2490 connectionAttachmentResponseInformationBuilder.setInstanceId(allottedResourceId);
2491 connectionAttachmentResponseInformationBuilder.setObjectPath(connectionAttachmentObjectPath);
2493 .setConnectionAttachmentResponseInformation(connectionAttachmentResponseInformationBuilder.build());
2495 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
2496 serviceResponseInformationBuilder.setInstanceId(siid);
2497 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
2498 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
2500 } catch (IllegalStateException e) {
2501 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
2502 responseBuilder.setResponseCode("500");
2503 responseBuilder.setResponseMessage(e.getMessage());
2504 responseBuilder.setAckFinalIndicator("Y");
2505 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2507 RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
2508 .<ConnectionAttachmentTopologyOperationOutput>status(true)
2509 .withResult(responseBuilder.build())
2512 return Futures.immediateFuture(rpcResult);
2516 responseBuilder.setResponseCode(responseObject.getStatusCode());
2517 responseBuilder.setAckFinalIndicator(ackFinal);
2518 trySetResponseMessage(responseBuilder, responseObject);
2519 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
2520 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
2522 RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
2523 .<ConnectionAttachmentTopologyOperationOutput>status(true)
2524 .withResult(responseBuilder.build())
2527 return Futures.immediateFuture(rpcResult);
2531 public ListenableFuture<RpcResult<TunnelxconnTopologyOperationOutput>> tunnelxconnTopologyOperation(
2532 TunnelxconnTopologyOperationInput input) {
2534 final String svcOperation = "tunnelxconn-topology-operation";
2535 Properties parms = new Properties();
2536 log.info(CALLED_STR, svcOperation);
2538 // create a new response object
2539 TunnelxconnTopologyOperationOutputBuilder responseBuilder = new TunnelxconnTopologyOperationOutputBuilder();
2540 if (hasInvalidServiceId(input)) {
2541 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
2542 responseBuilder.setResponseCode("404");
2543 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
2544 responseBuilder.setAckFinalIndicator("Y");
2546 RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
2547 .<TunnelxconnTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2549 return Futures.immediateFuture(rpcResult);
2551 String siid = input.getServiceInformation().getServiceInstanceId();
2552 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
2553 TunnelxconnTopologyOperationInputBuilder inputBuilder = new TunnelxconnTopologyOperationInputBuilder(input);
2554 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
2556 // Call SLI sync method
2558 ResponseObject responseObject = new ResponseObject("200", "");
2559 String ackFinal = "Y";
2560 String allottedResourceId = ERROR_NETWORK_ID;
2561 String serviceObjectPath = null;
2562 String tunnelxconnObjectPath = null;
2563 Properties respProps = tryGetProperties(svcOperation, parms, responseObject);
2565 if (respProps != null) {
2566 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2567 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2568 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2569 allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
2570 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
2571 tunnelxconnObjectPath = respProps.getProperty("tunnelxconn-object-path");
2574 if (failed(responseObject)) {
2575 responseBuilder.setResponseCode(responseObject.getStatusCode());
2576 responseBuilder.setResponseMessage(responseObject.getMessage());
2577 responseBuilder.setAckFinalIndicator(ackFinal);
2579 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2581 RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
2582 .<TunnelxconnTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2584 return Futures.immediateFuture(rpcResult);
2587 // Got success from SLI
2589 TunnelxconnResponseInformationBuilder tunnelxconnResponseInformationBuilder = new TunnelxconnResponseInformationBuilder();
2590 tunnelxconnResponseInformationBuilder.setInstanceId(allottedResourceId);
2591 tunnelxconnResponseInformationBuilder.setObjectPath(tunnelxconnObjectPath);
2592 responseBuilder.setTunnelxconnResponseInformation(tunnelxconnResponseInformationBuilder.build());
2594 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
2595 serviceResponseInformationBuilder.setInstanceId(siid);
2596 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
2597 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
2599 } catch (IllegalStateException e) {
2600 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
2601 responseBuilder.setResponseCode("500");
2602 responseBuilder.setResponseMessage(e.getMessage());
2603 responseBuilder.setAckFinalIndicator("Y");
2604 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2606 RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
2607 .<TunnelxconnTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2609 return Futures.immediateFuture(rpcResult);
2613 responseBuilder.setResponseCode(responseObject.getStatusCode());
2614 responseBuilder.setAckFinalIndicator(ackFinal);
2615 trySetResponseMessage(responseBuilder, responseObject);
2616 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
2617 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
2619 RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
2620 .<TunnelxconnTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2622 return Futures.immediateFuture(rpcResult);
2625 private void trySetResponseMessage(TunnelxconnTopologyOperationOutputBuilder responseBuilder,
2626 ResponseObject responseObject) {
2627 if (responseObject.getMessage() != null) {
2628 responseBuilder.setResponseMessage(responseObject.getMessage());
2632 private boolean hasInvalidServiceId(TunnelxconnTopologyOperationInput input) {
2633 return input == null || input.getServiceInformation() == null
2634 || input.getServiceInformation().getServiceInstanceId() == null
2635 || input.getServiceInformation().getServiceInstanceId().length() == 0;
2638 private Properties tryGetProperties(String svcOperation, Properties parms, ResponseObject responseObject) {
2640 if (svcLogicClient.hasGraph(APP_NAME, svcOperation, null, "sync")) {
2643 return svcLogicClient.execute(APP_NAME, svcOperation, null, "sync", parms);
2644 } catch (Exception e) {
2645 log.error(SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE, svcOperation, e);
2646 responseObject.setMessage(e.getMessage());
2647 responseObject.setStatusCode("500");
2650 responseObject.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
2651 responseObject.setStatusCode("503");
2653 } catch (Exception e) {
2654 responseObject.setMessage(e.getMessage());
2655 responseObject.setStatusCode("500");
2656 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
2662 public ListenableFuture<RpcResult<BrgTopologyOperationOutput>> brgTopologyOperation(
2663 BrgTopologyOperationInput input) {
2664 final String svcOperation = "brg-topology-operation";
2665 Properties parms = new Properties();
2667 log.info(CALLED_STR, svcOperation);
2668 // create a new response object
2669 BrgTopologyOperationOutputBuilder responseBuilder = new BrgTopologyOperationOutputBuilder();
2671 if (this.hasInvalidServiceId(input)) {
2673 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
2674 responseBuilder.setResponseCode("404");
2675 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
2676 responseBuilder.setAckFinalIndicator("Y");
2678 RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder.<BrgTopologyOperationOutput>status(true)
2679 .withResult(responseBuilder.build()).build();
2681 return Futures.immediateFuture(rpcResult);
2684 String siid = input.getServiceInformation().getServiceInstanceId();
2686 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
2687 BrgTopologyOperationInputBuilder inputBuilder = new BrgTopologyOperationInputBuilder(input);
2688 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
2690 // Call SLI sync method
2692 ResponseObject responseObject = new ResponseObject("200", "");
2693 String ackFinal = "Y";
2694 String allottedResourceId = ERROR_NETWORK_ID;
2695 String serviceObjectPath = null;
2696 String brgObjectPath = null;
2697 Properties respProps = tryGetProperties(svcOperation, parms, responseObject);
2699 if (respProps != null) {
2700 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2701 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2702 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2703 allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
2704 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
2705 brgObjectPath = respProps.getProperty("brg-object-path");
2708 if (failed(responseObject)) {
2709 responseBuilder.setResponseCode(responseObject.getStatusCode());
2710 responseBuilder.setResponseMessage(responseObject.getMessage());
2711 responseBuilder.setAckFinalIndicator(ackFinal);
2713 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2714 RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder.<BrgTopologyOperationOutput>status(true)
2715 .withResult(responseBuilder.build()).build();
2717 return Futures.immediateFuture(rpcResult);
2720 // Got success from SLI
2723 BrgResponseInformationBuilder brgResponseInformationBuilder = new BrgResponseInformationBuilder();
2724 brgResponseInformationBuilder.setInstanceId(allottedResourceId);
2725 brgResponseInformationBuilder.setObjectPath(brgObjectPath);
2726 responseBuilder.setBrgResponseInformation(brgResponseInformationBuilder.build());
2728 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
2729 serviceResponseInformationBuilder.setInstanceId(siid);
2730 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
2731 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
2733 } catch (IllegalStateException e) {
2734 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
2735 responseBuilder.setResponseCode("500");
2736 responseBuilder.setResponseMessage(e.getMessage());
2737 responseBuilder.setAckFinalIndicator("Y");
2738 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
2740 RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder.<BrgTopologyOperationOutput>status(true)
2741 .withResult(responseBuilder.build()).build();
2743 return Futures.immediateFuture(rpcResult);
2747 responseBuilder.setResponseCode(responseObject.getStatusCode());
2748 responseBuilder.setAckFinalIndicator(ackFinal);
2749 trySetResponseMessage(responseBuilder, responseObject);
2750 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
2751 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
2753 RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder.<BrgTopologyOperationOutput>status(true)
2754 .withResult(responseBuilder.build()).build();
2756 return Futures.immediateFuture(rpcResult);
2759 private void trySetResponseMessage(BrgTopologyOperationOutputBuilder responseBuilder,
2760 ResponseObject responseObject) {
2761 if (responseObject.getMessage() != null) {
2762 responseBuilder.setResponseMessage(responseObject.getMessage());
2766 private boolean hasInvalidServiceId(BrgTopologyOperationInput input) {
2767 return input == null || input.getServiceInformation() == null
2768 || input.getServiceInformation().getServiceInstanceId() == null
2769 || input.getServiceInformation().getServiceInstanceId().length() == 0;
2772 private String resolveAckFinal(ResponseObject responseObject, Properties respProps) {
2773 if (respProps != null) {
2774 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2775 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2776 return respProps.getProperty(ACK_FINAL_PARAM, "Y");
2782 public ListenableFuture<RpcResult<PreloadNetworkTopologyOperationOutput>> preloadNetworkTopologyOperation(
2783 PreloadNetworkTopologyOperationInput input) {
2785 final String svcOperation = "preload-network-topology-operation";
2786 PreloadData preloadData;
2787 Properties properties = new Properties();
2789 log.info(CALLED_STR, svcOperation);
2790 // create a new response object
2791 PreloadNetworkTopologyOperationOutputBuilder responseBuilder = new PreloadNetworkTopologyOperationOutputBuilder();
2793 if (hasInvalidPreloadNetwork(input)) {
2794 log.debug("exiting {} because of null or empty preload-network-topology-information", svcOperation);
2795 responseBuilder.setResponseCode("403");
2796 responseBuilder.setResponseMessage("invalid input, null or empty preload-network-topology-information");
2797 responseBuilder.setAckFinalIndicator("Y");
2799 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2800 .<PreloadNetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2802 return Futures.immediateFuture(rpcResult);
2805 // Grab the preload ID from the input buffer
2806 String preloadId = input.getPreloadNetworkTopologyInformation().getNetworkTopologyIdentifierStructure()
2808 String preloadType = "network";
2810 trySetSvcRequestId(input, responseBuilder);
2812 PreloadDataBuilder preloadDataBuilder = new PreloadDataBuilder();
2813 getPreloadData(preloadId, preloadType, preloadDataBuilder);
2815 PreloadDataBuilder operDataBuilder = new PreloadDataBuilder();
2816 getPreloadData(preloadId, preloadType, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
2819 // setup a preload-data object builder
2820 // ACTION preload-network-topology-operation
2822 // uses sdnc-request-header;
2823 // uses request-information;
2824 // uses preload-network-topology-information;
2826 // uses preload-topology-response-body;
2828 // container preload-data
2829 // uses preload-network-topology-information;
2830 // uses preload-oper-status;
2832 log.info(ADDING_INPUT_DATA_LOG, svcOperation, preloadId, input);
2833 PreloadNetworkTopologyOperationInputBuilder inputBuilder = new PreloadNetworkTopologyOperationInputBuilder(
2835 GenericResourceApiUtil.toProperties(properties, inputBuilder.build());
2836 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, preloadId, input);
2837 GenericResourceApiUtil.toProperties(properties, OPERATIONAL_DATA_PARAM, operDataBuilder);
2839 // Call SLI sync method
2840 ResponseObject responseObject = new ResponseObject("200", "");
2841 String ackFinal = "Y";
2842 Properties respProps = tryGetProperties(svcOperation, properties, preloadDataBuilder, responseObject);
2844 if (respProps != null) {
2845 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
2846 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
2847 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
2850 if (failed(responseObject)) {
2851 responseBuilder.setResponseCode(responseObject.getStatusCode());
2852 responseBuilder.setResponseMessage(responseObject.getMessage());
2853 responseBuilder.setAckFinalIndicator(ackFinal);
2854 log.error(RETURNED_FAILED_MESSAGE, svcOperation, preloadId, responseBuilder.build());
2855 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2856 .<PreloadNetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2857 return Futures.immediateFuture(rpcResult);
2860 // Got success from SLI
2862 preloadData = preloadDataBuilder.build();
2863 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, preloadId, preloadData);
2865 // preload-list object
2866 PreloadListBuilder preloadListBuilder = new PreloadListBuilder();
2867 preloadListBuilder.setPreloadId(preloadId);
2868 preloadListBuilder.setPreloadType(preloadType);
2869 preloadListBuilder.setPreloadData(preloadData);
2871 savePreloadList(preloadListBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
2872 log.info(UPDATING_TREE_INFO_MESSAGE);
2873 savePreloadList(preloadListBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
2875 tryDeletePreload(input, preloadListBuilder);
2876 } catch (Exception e) {
2877 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, preloadId, e);
2878 responseBuilder.setResponseCode("500");
2879 responseBuilder.setResponseMessage(e.getMessage());
2880 responseBuilder.setAckFinalIndicator("Y");
2881 log.error(RETURNED_FAILED_MESSAGE, svcOperation, preloadId, responseBuilder.build());
2882 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2883 .<PreloadNetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2884 return Futures.immediateFuture(rpcResult);
2888 responseBuilder.setResponseCode(responseObject.getStatusCode());
2889 responseBuilder.setAckFinalIndicator(ackFinal);
2890 trySetResponseMessage(responseBuilder, responseObject);
2891 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, preloadId);
2892 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, preloadId, responseBuilder.build());
2894 RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
2895 .<PreloadNetworkTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2896 return Futures.immediateFuture(rpcResult);
2899 private boolean hasInvalidPreloadNetwork(PreloadNetworkTopologyOperationInput input) {
2900 return input == null || input.getPreloadNetworkTopologyInformation() == null
2901 || input.getPreloadNetworkTopologyInformation().getNetworkTopologyIdentifierStructure() == null;
2904 private boolean hasInvalidPreloadId(String preloadId) {
2905 return preloadId == null || preloadId.length() == 0;
2908 private void trySetSvcRequestId(PreloadNetworkTopologyOperationInput input,
2909 PreloadNetworkTopologyOperationOutputBuilder responseBuilder) {
2910 if (input.getSdncRequestHeader() != null) {
2911 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
2915 private Properties tryGetProperties(String svcOperation, Properties parms, PreloadDataBuilder preloadDataBuilder,
2916 ResponseObject responseObject) {
2918 if (svcLogicClient.hasGraph(APP_NAME, svcOperation, null, "sync")) {
2920 return svcLogicClient.execute(APP_NAME, svcOperation, null, "sync", preloadDataBuilder, parms);
2921 } catch (Exception e) {
2922 log.error(SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE, svcOperation, e);
2923 responseObject.setMessage(e.getMessage());
2924 responseObject.setStatusCode("500");
2927 responseObject.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
2928 responseObject.setStatusCode("503");
2930 } catch (Exception e) {
2931 responseObject.setMessage(e.getMessage());
2932 responseObject.setStatusCode("500");
2933 log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
2939 private void trySetResponseMessage(PreloadNetworkTopologyOperationOutputBuilder responseBuilder,
2940 ResponseObject responseObject) {
2941 if (responseObject.getMessage() != null) {
2942 if (!responseObject.getMessage().isEmpty()) {
2943 responseBuilder.setResponseMessage(responseObject.getMessage());
2948 private void tryDeletePreload(PreloadNetworkTopologyOperationInput input, PreloadListBuilder preloadListBuilder) {
2949 if (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete)) {
2950 log.info("Delete from both CONFIGURATION and OPERATIONAL tree.");
2951 deletePreloadList(preloadListBuilder.build(), LogicalDatastoreType.OPERATIONAL);
2952 deletePreloadList(preloadListBuilder.build(), LogicalDatastoreType.CONFIGURATION);
2957 public ListenableFuture<RpcResult<PreloadVfModuleTopologyOperationOutput>> preloadVfModuleTopologyOperation(
2958 PreloadVfModuleTopologyOperationInput input) {
2960 final String svcOperation = "preload-vf-module-topology-operation";
2961 PreloadData preloadData;
2962 Properties properties = new Properties();
2964 log.info(CALLED_STR, svcOperation);
2965 // create a new response object
2966 PreloadVfModuleTopologyOperationOutputBuilder responseBuilder = new PreloadVfModuleTopologyOperationOutputBuilder();
2968 if (hasInvalidPreloadVfModule(input)) {
2970 "exiting {} because of null or empty preload-vf-module-topology-information.vf-module-topology.vf-module-topology-identifier.vf-module-name",
2972 responseBuilder.setResponseCode("403");
2973 responseBuilder.setResponseMessage(
2974 "invalid input, null or empty preload-vf-module-topology-information.vf-module-topology.vf-module-topology-identifier.vf-module-name");
2975 responseBuilder.setAckFinalIndicator("Y");
2977 RpcResult<PreloadVfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
2978 .<PreloadVfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
2980 return Futures.immediateFuture(rpcResult);
2983 // Grab the preload ID from the input buffer
2984 String preloadId = input.getPreloadVfModuleTopologyInformation().getVfModuleTopology()
2985 .getVfModuleTopologyIdentifier().getVfModuleName();
2986 String preloadType = "vf-module";
2988 trySetSvcRequestId(input, responseBuilder);
2990 PreloadDataBuilder preloadDataBuilder = new PreloadDataBuilder();
2991 getPreloadData(preloadId, preloadType, preloadDataBuilder);
2993 PreloadDataBuilder operDataBuilder = new PreloadDataBuilder();
2994 getPreloadData(preloadId, preloadType, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
2997 // setup a preload-data object builder
2998 // ACTION preload-vf-module-topology-operation
3000 // uses sdnc-request-header;
3001 // uses request-information;
3002 // uses preload-vnf-topology-information;
3004 // uses preload-topology-response-body;
3006 // container preload-data
3007 // uses preload-vf-module-topology-information;
3008 // uses preload-oper-status;
3010 log.info(ADDING_INPUT_DATA_LOG, svcOperation, preloadId, input);
3011 PreloadVfModuleTopologyOperationInputBuilder inputBuilder = new PreloadVfModuleTopologyOperationInputBuilder(
3013 GenericResourceApiUtil.toProperties(properties, inputBuilder.build());
3014 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, preloadId, input);
3015 GenericResourceApiUtil.toProperties(properties, OPERATIONAL_DATA_PARAM, operDataBuilder);
3017 // Call SLI sync method
3018 ResponseObject responseObject = new ResponseObject("200", "");
3019 String ackFinal = "Y";
3020 Properties respProps = tryGetProperties(svcOperation, properties, preloadDataBuilder, responseObject);
3022 if (respProps != null) {
3023 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
3024 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
3025 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
3028 if (failed(responseObject)) {
3029 responseBuilder.setResponseCode(responseObject.getStatusCode());
3030 responseBuilder.setResponseMessage(responseObject.getMessage());
3031 responseBuilder.setAckFinalIndicator(ackFinal);
3032 log.error(RETURNED_FAILED_MESSAGE, svcOperation, preloadId, responseBuilder.build());
3033 RpcResult<PreloadVfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
3034 .<PreloadVfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3035 return Futures.immediateFuture(rpcResult);
3038 // Got success from SLI
3040 preloadData = preloadDataBuilder.build();
3041 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, preloadId, preloadData);
3043 // preload-list object
3044 PreloadListBuilder preloadListBuilder = new PreloadListBuilder();
3045 preloadListBuilder.setPreloadId(preloadId);
3046 preloadListBuilder.setPreloadType(preloadType);
3047 preloadListBuilder.setPreloadData(preloadData);
3049 savePreloadList(preloadListBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
3050 log.info(UPDATING_TREE_INFO_MESSAGE);
3051 savePreloadList(preloadListBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
3053 tryDeletePreload(input, preloadListBuilder);
3055 } catch (Exception e) {
3056 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, preloadId, e);
3057 responseBuilder.setResponseCode("500");
3058 responseBuilder.setResponseMessage(e.getMessage());
3059 responseBuilder.setAckFinalIndicator("Y");
3060 log.error(RETURNED_FAILED_MESSAGE, svcOperation, preloadId, responseBuilder.build());
3061 RpcResult<PreloadVfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
3062 .<PreloadVfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3063 return Futures.immediateFuture(rpcResult);
3067 responseBuilder.setResponseCode(responseObject.getStatusCode());
3068 responseBuilder.setAckFinalIndicator(ackFinal);
3069 trySetResponseMessage(responseBuilder, responseObject);
3070 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, preloadId);
3071 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, preloadId, responseBuilder.build());
3073 RpcResult<PreloadVfModuleTopologyOperationOutput> rpcResult = RpcResultBuilder
3074 .<PreloadVfModuleTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3075 return Futures.immediateFuture(rpcResult);
3078 private boolean hasInvalidPreloadVfModule(PreloadVfModuleTopologyOperationInput input) {
3079 return input == null || input.getPreloadVfModuleTopologyInformation() == null
3080 || input.getPreloadVfModuleTopologyInformation().getVfModuleTopology() == null
3081 || input.getPreloadVfModuleTopologyInformation().getVfModuleTopology()
3082 .getVfModuleTopologyIdentifier() == null
3083 || input.getPreloadVfModuleTopologyInformation().getVfModuleTopology().getVfModuleTopologyIdentifier()
3084 .getVfModuleName() == null;
3087 private void trySetSvcRequestId(PreloadVfModuleTopologyOperationInput input,
3088 PreloadVfModuleTopologyOperationOutputBuilder responseBuilder) {
3089 if (input.getSdncRequestHeader() != null) {
3090 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
3094 private void trySetResponseMessage(PreloadVfModuleTopologyOperationOutputBuilder responseBuilder,
3095 ResponseObject responseObject) {
3096 if (responseObject.getMessage() != null) {
3097 if (!responseObject.getMessage().isEmpty()) {
3098 responseBuilder.setResponseMessage(responseObject.getMessage());
3103 private void tryDeletePreload(PreloadVfModuleTopologyOperationInput input, PreloadListBuilder preloadListBuilder) {
3104 if (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete)) {
3105 log.info("Delete from both CONFIGURATION and OPERATIONAL tree.");
3106 deletePreloadList(preloadListBuilder.build(), LogicalDatastoreType.OPERATIONAL);
3107 deletePreloadList(preloadListBuilder.build(), LogicalDatastoreType.CONFIGURATION);
3112 public ListenableFuture<RpcResult<GenericConfigurationTopologyOperationOutput>> genericConfigurationTopologyOperation(
3113 GenericConfigurationTopologyOperationInput input) {
3115 final String svcOperation = "generic-configuration-topology-operation";
3116 ServiceData serviceData;
3117 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
3118 Properties parms = new Properties();
3120 log.info(CALLED_STR, svcOperation);
3121 // create a new response object
3122 GenericConfigurationTopologyOperationOutputBuilder responseBuilder = new GenericConfigurationTopologyOperationOutputBuilder();
3124 if (hasInvalidService(input)) {
3125 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
3126 responseBuilder.setResponseCode("404");
3127 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
3128 responseBuilder.setAckFinalIndicator("Y");
3130 RpcResult<GenericConfigurationTopologyOperationOutput> rpcResult = RpcResultBuilder
3131 .<GenericConfigurationTopologyOperationOutput>status(true).withResult(responseBuilder.build())
3134 return Futures.immediateFuture(rpcResult);
3137 // Grab the service instance ID from the input buffer
3138 String siid = input.getServiceInformation().getServiceInstanceId();
3140 trySetSvcRequestId(input, responseBuilder);
3142 if (hasInvalidConfigurationIdOrType(input)) {
3143 log.debug("exiting {} because of null or empty configuration-id or configuration-type", svcOperation);
3144 responseBuilder.setResponseCode("404");
3145 responseBuilder.setResponseMessage("invalid input, null or empty configuration-id or configuration-type");
3146 responseBuilder.setAckFinalIndicator("Y");
3147 RpcResult<GenericConfigurationTopologyOperationOutput> rpcResult = RpcResultBuilder
3148 .<GenericConfigurationTopologyOperationOutput>status(true).withResult(responseBuilder.build())
3150 return Futures.immediateFuture(rpcResult);
3153 // Grab the configuration ID from the input buffer
3154 String configId = input.getConfigurationInformation().getConfigurationId();
3156 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
3157 getServiceData(siid, serviceDataBuilder);
3159 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
3160 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
3162 // Set the serviceStatus based on input
3163 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
3164 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
3166 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
3167 GenericConfigurationTopologyOperationInputBuilder inputBuilder = new GenericConfigurationTopologyOperationInputBuilder(
3169 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
3171 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
3172 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
3174 // Call SLI sync method
3176 ResponseObject responseObject = new ResponseObject("200", "");
3177 String ackFinal = "Y";
3178 String serviceObjectPath = "";
3179 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
3181 if (respProps != null) {
3182 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
3183 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
3184 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
3185 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
3188 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
3189 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
3190 serviceStatusBuilder.setRpcName(svcOperation);
3192 if (failed(responseObject)) {
3193 responseBuilder.setResponseCode(responseObject.getStatusCode());
3194 responseBuilder.setResponseMessage(responseObject.getMessage());
3195 responseBuilder.setAckFinalIndicator(ackFinal);
3197 ServiceBuilder serviceBuilder = new ServiceBuilder();
3198 serviceBuilder.setServiceInstanceId(siid);
3199 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3201 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
3202 } catch (Exception e) {
3203 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3205 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
3207 RpcResult<GenericConfigurationTopologyOperationOutput> rpcResult = RpcResultBuilder
3208 .<GenericConfigurationTopologyOperationOutput>status(true).withResult(responseBuilder.build())
3211 return Futures.immediateFuture(rpcResult);
3214 // Got success from SLI
3216 serviceData = serviceDataBuilder.build();
3219 ServiceBuilder serviceBuilder = new ServiceBuilder();
3220 serviceBuilder.setServiceData(serviceData);
3221 serviceBuilder.setServiceInstanceId(siid);
3222 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3223 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
3225 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
3226 serviceResponseInformationBuilder.setInstanceId(siid);
3227 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
3228 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
3229 GcResponseInformationBuilder gcResponseInformationBuilder = new GcResponseInformationBuilder();
3230 gcResponseInformationBuilder.setInstanceId(configId);
3231 responseBuilder.setGcResponseInformation(gcResponseInformationBuilder.build());
3233 } catch (Exception e) {
3234 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3235 responseBuilder.setResponseCode("500");
3236 responseBuilder.setResponseMessage(e.getMessage());
3237 responseBuilder.setAckFinalIndicator("Y");
3238 RpcResult<GenericConfigurationTopologyOperationOutput> rpcResult = RpcResultBuilder
3239 .<GenericConfigurationTopologyOperationOutput>status(true).withResult(responseBuilder.build())
3242 return Futures.immediateFuture(rpcResult);
3246 responseBuilder.setResponseCode(responseObject.getStatusCode());
3247 responseBuilder.setAckFinalIndicator(ackFinal);
3248 trySetResponseMessage(responseBuilder, responseObject);
3249 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
3250 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
3252 RpcResult<GenericConfigurationTopologyOperationOutput> rpcResult = RpcResultBuilder
3253 .<GenericConfigurationTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3255 return Futures.immediateFuture(rpcResult);
3258 private boolean hasInvalidService(GenericConfigurationTopologyOperationInput input) {
3259 return input == null || input.getServiceInformation() == null
3260 || input.getServiceInformation().getServiceInstanceId() == null
3261 || input.getServiceInformation().getServiceInstanceId().length() == 0;
3264 private void trySetSvcRequestId(GenericConfigurationTopologyOperationInput input,
3265 GenericConfigurationTopologyOperationOutputBuilder responseBuilder) {
3266 if (input.getSdncRequestHeader() != null) {
3267 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
3271 private boolean hasInvalidConfigurationIdOrType(GenericConfigurationTopologyOperationInput input) {
3272 return input.getConfigurationInformation() == null
3273 || input.getConfigurationInformation().getConfigurationId() == null
3274 || input.getConfigurationInformation().getConfigurationType() == null;
3277 private void trySetResponseMessage(GenericConfigurationTopologyOperationOutputBuilder responseBuilder,
3278 ResponseObject responseObject) {
3279 if (responseObject.getMessage() != null) {
3280 if (!responseObject.getMessage().isEmpty()) {
3281 responseBuilder.setResponseMessage(responseObject.getMessage());
3287 public ListenableFuture<RpcResult<GenericConfigurationNotificationOutput>> genericConfigurationNotification(
3288 GenericConfigurationNotificationInput input) {
3290 final String svcOperation = "generic-configuration-notification";
3291 ServiceData serviceData;
3292 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
3293 Properties parms = new Properties();
3295 log.info(CALLED_STR, svcOperation);
3297 // Grab the service instance ID from the input buffer
3298 String siid = input.getServiceInformation().getServiceInstanceId();
3300 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
3301 getServiceData(siid, serviceDataBuilder);
3303 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
3304 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
3306 // Set the serviceStatus based on input
3307 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
3308 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
3310 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
3311 GenericConfigurationNotificationInputBuilder inputBuilder = new GenericConfigurationNotificationInputBuilder(
3313 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
3315 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
3316 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
3318 // Call SLI sync method
3320 ResponseObject responseObject = new ResponseObject("200", "");
3321 String ackFinal = "Y";
3322 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
3324 if (respProps != null) {
3325 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
3326 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
3327 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
3330 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
3331 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
3332 serviceStatusBuilder.setRpcName(svcOperation);
3334 if (failed(responseObject)) {
3335 ServiceBuilder serviceBuilder = new ServiceBuilder();
3336 serviceBuilder.setServiceInstanceId(siid);
3337 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3339 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
3340 } catch (Exception e) {
3341 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3344 RpcResult<GenericConfigurationNotificationOutput> rpcResult = RpcResultBuilder.<GenericConfigurationNotificationOutput>status(
3347 return Futures.immediateFuture(rpcResult);
3350 // Got success from SLI
3352 serviceData = serviceDataBuilder.build();
3355 ServiceBuilder serviceBuilder = new ServiceBuilder();
3356 serviceBuilder.setServiceData(serviceData);
3357 serviceBuilder.setServiceInstanceId(siid);
3358 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3359 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
3361 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
3362 serviceResponseInformationBuilder.setInstanceId(siid);
3364 } catch (Exception e) {
3365 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3366 RpcResult<GenericConfigurationNotificationOutput> rpcResult = RpcResultBuilder.<GenericConfigurationNotificationOutput>status(
3369 return Futures.immediateFuture(rpcResult);
3373 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
3375 RpcResult<GenericConfigurationNotificationOutput> rpcResult = RpcResultBuilder.<GenericConfigurationNotificationOutput>status(
3378 return Futures.immediateFuture(rpcResult);
3382 public ListenableFuture<RpcResult<GetpathsegmentTopologyOperationOutput>> getpathsegmentTopologyOperation(
3383 GetpathsegmentTopologyOperationInput input) {
3385 final String svcOperation = "getpathsegment-topology-operation";
3386 ServiceData serviceData;
3387 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
3388 Properties parms = new Properties();
3390 log.info(CALLED_STR, svcOperation);
3391 // create a new response object
3392 GetpathsegmentTopologyOperationOutputBuilder responseBuilder = new GetpathsegmentTopologyOperationOutputBuilder();
3394 if (hasInvalidService(input)) {
3395 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
3396 responseBuilder.setResponseCode("404");
3397 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
3398 responseBuilder.setAckFinalIndicator("Y");
3400 RpcResult<GetpathsegmentTopologyOperationOutput> rpcResult = RpcResultBuilder
3401 .<GetpathsegmentTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3403 return Futures.immediateFuture(rpcResult);
3406 // Grab the service instance ID from the input buffer
3407 String siid = input.getServiceInformation().getServiceInstanceId();
3409 trySetSvcRequestId(input, responseBuilder);
3411 if (hasInvalidOnapModelInformation(input)) {
3412 log.debug("exiting {} because no model-uuid provided", svcOperation);
3413 responseBuilder.setResponseCode("404");
3414 responseBuilder.setResponseMessage("invalid input, no model-uuid provided");
3415 responseBuilder.setAckFinalIndicator("Y");
3416 RpcResult<GetpathsegmentTopologyOperationOutput> rpcResult = RpcResultBuilder
3417 .<GetpathsegmentTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3418 return Futures.immediateFuture(rpcResult);
3421 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
3422 getServiceData(siid, serviceDataBuilder);
3424 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
3425 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
3427 // Set the serviceStatus based on input
3428 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
3429 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
3431 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
3432 GetpathsegmentTopologyOperationInputBuilder inputBuilder = new GetpathsegmentTopologyOperationInputBuilder(
3434 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
3436 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
3437 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
3439 // Call SLI sync method
3441 ResponseObject responseObject = new ResponseObject("200", "");
3442 String ackFinal = "Y";
3443 String serviceObjectPath = null;
3444 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
3446 if (respProps != null) {
3447 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
3448 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
3449 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
3450 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
3453 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
3454 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
3455 serviceStatusBuilder.setRpcName(svcOperation);
3457 if (failed(responseObject)) {
3458 responseBuilder.setResponseCode(responseObject.getStatusCode());
3459 responseBuilder.setResponseMessage(responseObject.getMessage());
3460 responseBuilder.setAckFinalIndicator(ackFinal);
3462 ServiceBuilder serviceBuilder = new ServiceBuilder();
3463 serviceBuilder.setServiceInstanceId(siid);
3464 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3466 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
3467 } catch (Exception e) {
3468 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3470 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
3472 RpcResult<GetpathsegmentTopologyOperationOutput> rpcResult = RpcResultBuilder
3473 .<GetpathsegmentTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3475 return Futures.immediateFuture(rpcResult);
3478 // Got success from SLI
3480 serviceData = serviceDataBuilder.build();
3481 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
3484 ServiceBuilder serviceBuilder = new ServiceBuilder();
3485 serviceBuilder.setServiceData(serviceData);
3486 serviceBuilder.setServiceInstanceId(siid);
3487 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3488 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
3490 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
3491 serviceResponseInformationBuilder.setInstanceId(siid);
3492 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
3493 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
3495 } catch (Exception e) {
3496 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3497 responseBuilder.setResponseCode("500");
3498 responseBuilder.setResponseMessage(e.getMessage());
3499 responseBuilder.setAckFinalIndicator("Y");
3500 RpcResult<GetpathsegmentTopologyOperationOutput> rpcResult = RpcResultBuilder
3501 .<GetpathsegmentTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3503 return Futures.immediateFuture(rpcResult);
3507 responseBuilder.setResponseCode(responseObject.getStatusCode());
3508 responseBuilder.setAckFinalIndicator(ackFinal);
3509 trySetResponseMessage(responseBuilder, responseObject);
3510 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
3511 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
3513 RpcResult<GetpathsegmentTopologyOperationOutput> rpcResult = RpcResultBuilder
3514 .<GetpathsegmentTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3516 return Futures.immediateFuture(rpcResult);
3519 private boolean hasInvalidService(GetpathsegmentTopologyOperationInput input) {
3520 return input == null || input.getServiceInformation() == null
3521 || input.getServiceInformation().getServiceInstanceId() == null
3522 || input.getServiceInformation().getServiceInstanceId().length() == 0;
3525 private void trySetSvcRequestId(GetpathsegmentTopologyOperationInput input,
3526 GetpathsegmentTopologyOperationOutputBuilder responseBuilder) {
3527 if (input.getSdncRequestHeader() != null) {
3528 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
3532 private boolean hasInvalidOnapModelInformation(GetpathsegmentTopologyOperationInput input) {
3533 return input.getServiceInformation() == null || input.getServiceInformation().getOnapModelInformation() == null
3534 || input.getServiceInformation().getOnapModelInformation().getModelUuid() == null;
3537 private void trySetResponseMessage(GetpathsegmentTopologyOperationOutputBuilder responseBuilder,
3538 ResponseObject responseObject) {
3539 if (responseObject.getMessage() != null) {
3540 if (!responseObject.getMessage().isEmpty()) {
3541 responseBuilder.setResponseMessage(responseObject.getMessage());
3547 public ListenableFuture<RpcResult<PolicyUpdateNotifyOperationOutput>> policyUpdateNotifyOperation(
3548 PolicyUpdateNotifyOperationInput input) {
3550 final String svcOperation = "policy-update-notify-operation";
3551 Properties parms = new Properties();
3553 log.info(CALLED_STR, svcOperation);
3555 // create a new response object
3556 PolicyUpdateNotifyOperationOutputBuilder responseBuilder = new PolicyUpdateNotifyOperationOutputBuilder();
3558 // Make sure we have a valid input
3559 if (hasInvalidInput(input)) {
3560 log.debug("exiting {} because policy name, update type, or version id was not provided", svcOperation);
3561 responseBuilder.setErrorCode("404");
3562 responseBuilder.setErrorMsg("Invalid input, missing input data");
3563 RpcResult<PolicyUpdateNotifyOperationOutput> rpcResult = RpcResultBuilder
3564 .<PolicyUpdateNotifyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3565 return Futures.immediateFuture(rpcResult);
3568 log.info("Adding INPUT data for {} input: {}", svcOperation, input);
3569 PolicyUpdateNotifyOperationInputBuilder inputBuilder = new PolicyUpdateNotifyOperationInputBuilder(input);
3570 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
3572 // Call SLI sync method
3573 ResponseObject responseObject = new ResponseObject("200", "");
3574 String ackFinal = "Y";
3575 String serviceObjectPath = null;
3576 Properties respProps = tryGetProperties(svcOperation, parms, responseObject);
3578 if (respProps != null) {
3579 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
3580 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
3581 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
3582 serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
3585 if (failed(responseObject)) {
3586 responseBuilder.setErrorCode(responseObject.getStatusCode());
3587 responseBuilder.setErrorMsg(responseObject.getMessage());
3588 log.error(RETURNED_FAILED_MESSAGE, svcOperation, "policy update", responseBuilder.build());
3590 RpcResult<PolicyUpdateNotifyOperationOutput> rpcResult = RpcResultBuilder
3591 .<PolicyUpdateNotifyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3593 return Futures.immediateFuture(rpcResult);
3596 // Got success from SLI
3597 responseBuilder.setErrorCode(responseObject.getStatusCode());
3598 if (responseObject.getMessage() != null) {
3599 responseBuilder.setErrorMsg(responseObject.getMessage());
3601 log.info("Returned SUCCESS for " + svcOperation + responseBuilder.build());
3602 RpcResult<PolicyUpdateNotifyOperationOutput> rpcResult = RpcResultBuilder
3603 .<PolicyUpdateNotifyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3605 return Futures.immediateFuture(rpcResult);
3608 private boolean hasInvalidInput(PolicyUpdateNotifyOperationInput input) {
3609 return (input.getPolicyName() == null) || (input.getUpdateType() == null) || (input.getVersionId() == null);
3613 public ListenableFuture<RpcResult<PortMirrorTopologyOperationOutput>> portMirrorTopologyOperation(
3614 final PortMirrorTopologyOperationInput input) {
3616 final String svcOperation = "port-mirror-topology-operation";
3617 ServiceData serviceData = null;
3618 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
3619 Properties properties = new Properties();
3621 log.info(CALLED_STR, svcOperation);
3623 // create a new response object
3624 PortMirrorTopologyOperationOutputBuilder responseBuilder = new PortMirrorTopologyOperationOutputBuilder();
3626 if (hasInvalidService(input)) {
3627 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
3628 responseBuilder.setResponseCode("404");
3629 responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
3630 responseBuilder.setAckFinalIndicator("Y");
3631 RpcResult<PortMirrorTopologyOperationOutput> rpcResult = RpcResultBuilder
3632 .<PortMirrorTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3634 return Futures.immediateFuture(rpcResult);
3637 if (hasInvalidConfigurationId(input)) {
3638 log.debug("exiting {} because of null or empty configuration-id", svcOperation);
3639 responseBuilder.setResponseCode("404");
3640 responseBuilder.setResponseMessage("invalid input, null or empty configuration-id");
3641 responseBuilder.setAckFinalIndicator("Y");
3642 RpcResult<PortMirrorTopologyOperationOutput> rpcResult = RpcResultBuilder
3643 .<PortMirrorTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3644 return Futures.immediateFuture(rpcResult);
3647 // Grab the service instance ID from the input buffer
3648 String siid = input.getServiceInformation().getServiceInstanceId();
3650 trySetSvcRequestId(input, responseBuilder);
3652 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
3653 getServiceData(siid, serviceDataBuilder);
3655 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
3656 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
3658 // Set the serviceStatus based on input
3659 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
3660 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
3662 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
3663 PortMirrorTopologyOperationInputBuilder inputBuilder = new PortMirrorTopologyOperationInputBuilder(input);
3664 GenericResourceApiUtil.toProperties(properties, inputBuilder.build());
3666 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
3667 GenericResourceApiUtil.toProperties(properties, OPERATIONAL_DATA_PARAM, operDataBuilder);
3669 // Call SLI sync method
3670 ResponseObject responseObject = new ResponseObject("200", "");
3671 String ackFinal = "Y";
3672 String serviceObjectPath = null;
3673 String portMirrorObjectPath = null;
3674 Properties respProps = tryGetProperties(svcOperation, properties, serviceDataBuilder, responseObject);
3676 if (respProps != null) {
3677 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
3678 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
3679 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
3680 serviceObjectPath = respProps.getProperty("service-object-path");
3681 portMirrorObjectPath = respProps.getProperty("port-mirror-object-path");
3684 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
3685 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
3686 serviceStatusBuilder.setRpcName(svcOperation);
3688 if (failed(responseObject)) {
3689 responseBuilder.setResponseCode(responseObject.getStatusCode());
3690 responseBuilder.setResponseMessage(responseObject.getMessage());
3691 responseBuilder.setAckFinalIndicator(ackFinal);
3693 ServiceBuilder serviceBuilder = new ServiceBuilder();
3694 serviceBuilder.setServiceInstanceId(siid);
3695 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3697 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
3698 } catch (Exception e) {
3699 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3701 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
3703 RpcResult<PortMirrorTopologyOperationOutput> rpcResult = RpcResultBuilder
3704 .<PortMirrorTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3707 return Futures.immediateFuture(rpcResult);
3710 // Got success from SLI
3712 serviceData = serviceDataBuilder.build();
3713 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
3716 ServiceBuilder serviceBuilder = new ServiceBuilder();
3717 serviceBuilder.setServiceData(serviceData);
3718 serviceBuilder.setServiceInstanceId(siid);
3719 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3720 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
3722 if (input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null) {
3723 // Only update operational tree on activate or delete
3724 if (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign)
3725 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)) {
3726 log.info(UPDATING_TREE_INFO_MESSAGE);
3727 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
3731 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
3732 serviceResponseInformationBuilder.setInstanceId(siid);
3733 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
3734 responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
3735 PortMirrorResponseInformationBuilder portMirrorResponseInformationBuilder = new PortMirrorResponseInformationBuilder();
3736 portMirrorResponseInformationBuilder
3737 .setInstanceId(input.getConfigurationInformation().getConfigurationId());
3738 portMirrorResponseInformationBuilder.setObjectPath(portMirrorObjectPath);
3739 responseBuilder.setPortMirrorResponseInformation(portMirrorResponseInformationBuilder.build());
3741 } catch (Exception e) {
3742 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3743 responseBuilder.setResponseCode("500");
3744 responseBuilder.setResponseMessage(e.getMessage());
3745 responseBuilder.setAckFinalIndicator("Y");
3746 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
3747 RpcResult<PortMirrorTopologyOperationOutput> rpcResult = RpcResultBuilder
3748 .<PortMirrorTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3749 return Futures.immediateFuture(rpcResult);
3753 responseBuilder.setResponseCode(responseObject.getStatusCode());
3754 responseBuilder.setAckFinalIndicator(ackFinal);
3755 trySetResponseMessage(responseBuilder, responseObject);
3756 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
3757 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
3759 RpcResult<PortMirrorTopologyOperationOutput> rpcResult = RpcResultBuilder
3760 .<PortMirrorTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
3762 if (ackFinal.equals("N")) {
3763 // Spawn background thread to invoke the Async DG
3764 Runnable backgroundThread = new Runnable() {
3766 log.info(BACKGROUND_THREAD_STARTED_MESSAGE);
3767 processAsyncPortMirrorTopologyOperation(input);
3770 new Thread(backgroundThread).start();
3774 return Futures.immediateFuture(rpcResult);
3777 private boolean hasInvalidService(PortMirrorTopologyOperationInput input) {
3778 return input == null || input.getServiceInformation() == null
3779 || input.getServiceInformation().getServiceInstanceId() == null
3780 || input.getServiceInformation().getServiceInstanceId().length() == 0;
3783 private boolean hasInvalidConfigurationId(PortMirrorTopologyOperationInput input) {
3784 return input.getConfigurationInformation() == null
3785 || input.getConfigurationInformation().getConfigurationId() == null
3786 || input.getConfigurationInformation().getConfigurationId().length() == 0;
3789 private void trySetSvcRequestId(PortMirrorTopologyOperationInput input,
3790 PortMirrorTopologyOperationOutputBuilder responseBuilder) {
3791 if (input.getSdncRequestHeader() != null) {
3792 responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
3796 private void trySetResponseMessage(PortMirrorTopologyOperationOutputBuilder responseBuilder,
3797 ResponseObject responseObject) {
3798 if (responseObject.getMessage() != null) {
3799 if (!responseObject.getMessage().isEmpty()) {
3800 responseBuilder.setResponseMessage(responseObject.getMessage());
3805 public void processAsyncPortMirrorTopologyOperation(PortMirrorTopologyOperationInput input) {
3806 log.info(BACKGROUND_THREAD_INFO, input.getConfigurationInformation().getConfigurationId());
3808 final String svcOperation = "port-mirror-topology-operation-async";
3809 ServiceData serviceData = null;
3810 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
3811 Properties parms = new Properties();
3813 log.info(CALLED_STR, svcOperation);
3815 // Grab the service instance ID from the input buffer
3816 String siid = input.getServiceInformation().getServiceInstanceId();
3818 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
3819 getServiceData(siid, serviceDataBuilder);
3821 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
3822 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
3824 // Set the serviceStatus based on input
3825 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
3826 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
3828 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
3829 PortMirrorTopologyOperationInputBuilder inputBuilder = new PortMirrorTopologyOperationInputBuilder(input);
3830 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
3832 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
3833 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
3835 // Call SLI sync method
3836 ResponseObject responseObject = new ResponseObject("200", "");
3837 String ackFinal = "Y";
3838 String serviceObjectPath = null;
3839 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
3841 if (respProps != null) {
3842 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
3843 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
3844 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
3847 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
3848 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
3849 serviceStatusBuilder.setRpcName(svcOperation);
3851 if (failed(responseObject)) {
3852 ServiceBuilder serviceBuilder = new ServiceBuilder();
3853 serviceBuilder.setServiceInstanceId(siid);
3854 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3856 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
3857 } catch (Exception e) {
3858 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3865 // Got success from SLI
3867 serviceData = serviceDataBuilder.build();
3868 log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
3871 ServiceBuilder serviceBuilder = new ServiceBuilder();
3872 serviceBuilder.setServiceData(serviceData);
3873 serviceBuilder.setServiceInstanceId(siid);
3874 serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
3875 saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
3877 if (input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null) {
3878 // Only update operational tree on activate or delete
3879 if (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign)
3880 || input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate)) {
3881 log.info(UPDATING_TREE_INFO_MESSAGE);
3882 saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
3886 ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
3887 serviceResponseInformationBuilder.setInstanceId(siid);
3888 serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
3890 } catch (Exception e) {
3891 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
3896 log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
3902 public ListenableFuture<RpcResult<VnfGetResourceRequestOutput>> vnfGetResourceRequest(
3903 VnfGetResourceRequestInput input) {
3905 final String svcOperation = "vnf-get-resource-request";
3906 ServiceData serviceData;
3907 ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
3908 Properties parms = new Properties();
3910 log.info(CALLED_STR, svcOperation);
3911 // create a new response object
3912 VnfGetResourceRequestOutputBuilder responseBuilder = new VnfGetResourceRequestOutputBuilder();
3914 if (hasInvalidService(input)) {
3915 log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
3916 RpcResult<VnfGetResourceRequestOutput> rpcResult = RpcResultBuilder
3917 .<VnfGetResourceRequestOutput>status(true).withResult(responseBuilder.build()).build();
3919 return Futures.immediateFuture(rpcResult);
3922 // Grab the service instance ID from the input buffer
3923 String siid = input.getServiceInformation().getServiceInstanceId();
3925 ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
3926 getServiceData(siid, serviceDataBuilder);
3928 ServiceDataBuilder operDataBuilder = new ServiceDataBuilder();
3929 getServiceData(siid, operDataBuilder, LogicalDatastoreType.OPERATIONAL);
3931 // Set the serviceStatus based on input
3932 setServiceStatus(serviceStatusBuilder, input.getSdncRequestHeader());
3933 setServiceStatus(serviceStatusBuilder, input.getRequestInformation());
3935 log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
3936 VnfGetResourceRequestInputBuilder inputBuilder = new VnfGetResourceRequestInputBuilder(input);
3937 GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
3939 log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid, operDataBuilder.build());
3940 GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
3942 // Call SLI sync method
3944 ResponseObject responseObject = new ResponseObject("200", "");
3945 String ackFinal = "Y";
3946 String serviceObjectPath = null;
3947 Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
3949 if (respProps != null) {
3950 responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
3951 responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
3952 ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
3953 serviceObjectPath = respProps.getProperty("service-object-path");
3956 setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
3957 serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
3958 serviceStatusBuilder.setRpcName(svcOperation);
3960 if (failed(responseObject)) {
3961 log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
3962 RpcResult<VnfGetResourceRequestOutput> rpcResult = RpcResultBuilder
3963 .<VnfGetResourceRequestOutput>status(true).withResult(responseBuilder.build()).build();
3965 return Futures.immediateFuture(rpcResult);
3968 // Got success from SLI
3969 log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
3971 if (respProps != null) {
3972 GenericResourceApiUtil.toBuilder(respProps, responseBuilder);
3975 RpcResult<VnfGetResourceRequestOutput> rpcResult = RpcResultBuilder.<VnfGetResourceRequestOutput>status(true)
3976 .withResult(responseBuilder.build()).build();
3979 return Futures.immediateFuture(rpcResult);
3982 private boolean hasInvalidService(VnfGetResourceRequestInput input) {
3983 return input == null || input.getServiceInformation() == null
3984 || input.getServiceInformation().getServiceInstanceId() == null
3985 || input.getServiceInformation().getServiceInstanceId().length() == 0;