98b16f54968240c09da05b41391e1f5e119408a5
[ccsdk/features.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * openECOMP : SDN-C
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights
6  *                      reserved.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.ccsdk.features.sdnr.northbound.oofpcipoc;
23
24 import java.io.Writer;
25 import java.io.StringWriter;
26 import java.util.ArrayList;
27 import java.util.List;
28 import java.io.IOException;
29 import java.util.Properties;
30 import java.util.concurrent.ExecutorService;
31 import java.util.concurrent.Executors;
32
33 import org.apache.velocity.VelocityContext;
34 import org.apache.velocity.app.VelocityEngine;
35 import org.onap.ccsdk.features.sdnr.northbound.oofpcipoc.handlenotif.pojos.CellConfig;
36 import org.onap.ccsdk.features.sdnr.northbound.oofpcipoc.handlenotif.pojos.FAPServiceList;
37 import org.onap.ccsdk.features.sdnr.northbound.oofpcipoc.handlenotif.pojos.LTE;
38 import org.onap.ccsdk.features.sdnr.northbound.oofpcipoc.handlenotif.pojos.LTENeighborListInUseLTECell;
39 import org.onap.ccsdk.features.sdnr.northbound.oofpcipoc.handlenotif.pojos.NeighborListInUse;
40 import org.onap.ccsdk.features.sdnr.northbound.oofpcipoc.handlenotif.pojos.PayloadObject;
41 import org.onap.ccsdk.features.sdnr.northbound.oofpcipoc.handlenotif.pojos.RAN;
42 import org.onap.ccsdk.features.sdnr.northbound.oofpcipoc.handlenotif.pojos.RadioAccess;
43 import org.onap.ccsdk.features.sdnr.northbound.oofpcipoc.handlenotif.pojos.X0005b9Lte;
44 import org.onap.ccsdk.sli.core.sli.provider.MdsalHelper;
45 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
46 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
47 import org.opendaylight.yang.gen.v1.org.onap.ccsdk.rev190308.*;
48
49 import org.opendaylight.yang.gen.v1.org.onap.ccsdk.features.sdnr.northbound.oofpcipoc.rev190308.OofpcipocListener;
50 import org.opendaylight.yang.gen.v1.org.onap.ccsdk.features.sdnr.northbound.oofpcipoc.rev190308.Payload;
51 import org.opendaylight.yang.gen.v1.org.onap.ccsdk.features.sdnr.northbound.oofpcipoc.rev190308.NbrlistChangeNotification;
52 import org.opendaylight.yang.gen.v1.org.onap.ccsdk.features.sdnr.northbound.oofpcipoc.rev190308.NetconfConfigChange;
53 import org.opendaylight.yang.gen.v1.org.onap.ccsdk.features.sdnr.northbound.oofpcipoc.rev190308.nbrlist.change.notification.*;
54 import org.opendaylight.yang.gen.v1.org.onap.ccsdk.features.sdnr.northbound.oofpcipoc.rev190308.nbrlist.change.notification.fap.service.*;
55
56 import com.fasterxml.jackson.annotation.JsonProperty;
57 import com.fasterxml.jackson.core.JsonProcessingException;
58 import com.fasterxml.jackson.databind.ObjectMapper;
59
60 import com.google.common.base.Preconditions;
61 import org.slf4j.Logger;
62 import org.slf4j.LoggerFactory;
63 import org.json.JSONArray;
64 import org.json.JSONObject;
65
66 import com.google.common.util.concurrent.Futures;
67 import com.google.common.util.concurrent.ListenableFuture;
68 import com.google.common.util.concurrent.FutureCallback;
69 import com.google.common.util.concurrent.MoreExecutors;
70
71 /**
72  * Defines a base implementation for your listener. This class extends from a
73  * helper class which provides storage for the most commonly used components of
74  * the MD-SAL. Additionally the base class provides some basic logging and
75  * initialization / clean up methods.
76  *
77  */
78 public class OofpcipocHandleNotif implements AutoCloseable, OofpcipocListener {
79
80         private static final Logger LOG = LoggerFactory.getLogger(OofpcipocHandleNotif.class);
81
82         private static final String APPLICATION_NAME = "Oofpcipoc";
83
84         private static final String TRUE = "true";
85         private static final String FALSE = "false";
86         private static final String UTF_8 = "UTF-8";
87
88         private static final String PARAMETER_NAME = "parameter-name";
89     private static final String STRING_VALUE = "string-value";
90
91         private final ExecutorService executor;
92
93         protected DataBroker dataBroker;
94
95         private final OofpcipocClient OofpcipocClient;
96
97         public OofpcipocHandleNotif(final DataBroker dataBroker, final OofpcipocClient OofpcipocClient) {
98
99                 this.LOG.info("Creating listener for {}", APPLICATION_NAME);
100                 executor = Executors.newFixedThreadPool(1);
101                 this.dataBroker = dataBroker;
102                 this.OofpcipocClient = OofpcipocClient;
103                 initialize();
104         }
105
106         public void initialize() {
107                 LOG.info("Placeholder: Initializing listener  for {}", APPLICATION_NAME);
108         }
109
110         protected void initializeChild() {
111                 // Override if you have custom initialization intelligence
112         }
113
114         @Override
115         public void close() throws Exception {
116                 LOG.info("Closing listener for {}", APPLICATION_NAME);
117                 executor.shutdown();
118                 LOG.info("Successfully closed listener for {}", APPLICATION_NAME);
119         }
120
121         @Override
122         public void onNbrlistChangeNotification(final NbrlistChangeNotification notification) {
123
124                 LOG.info("Reached onNbrlistChangeNotification");
125
126                 LOG.info("Number of FAPService Entries Changed {}", notification.getFapServiceNumberOfEntriesChanged());
127
128                 // START: Create RadioAccess payload object/string from the notification
129
130                 String payloadString = null;
131                 PayloadObject payloadObject = new PayloadObject();
132                 org.onap.ccsdk.features.sdnr.northbound.oofpcipoc.handlenotif.pojos.Payload payload = new org.onap.ccsdk.features.sdnr.northbound.oofpcipoc.handlenotif.pojos.Payload();
133                 RadioAccess radioAccess = new RadioAccess();
134                 List<FAPServiceList> fAPServiceList = new ArrayList<>();
135
136                 radioAccess.setFAPServiceNumberOfEntries(notification.getFapServiceNumberOfEntriesChanged().toString());
137
138                 for (FapService fapSvc : notification.getFapService()) {
139
140                         FAPServiceList fapServiceElement = new FAPServiceList();
141
142                         fapServiceElement.setAlias(fapSvc.getAlias());
143                         fapServiceElement.setX0005b9Lte(new X0005b9Lte(fapSvc.getPhyCellIdInUse().toString(), fapSvc.getPnfName()));
144
145                         List<LTENeighborListInUseLTECell> lTENeighborListInUseLTECell = new ArrayList<>();
146
147                         for (LteRanNeighborListInUseLteCellChanged lteRanElement : fapSvc
148                                         .getLteRanNeighborListInUseLteCellChanged()) {
149                                 LTENeighborListInUseLTECell lTENeighborListInUseLTECellElement = new LTENeighborListInUseLTECell();
150                                 lTENeighborListInUseLTECellElement.setAlias(lteRanElement.getCid());
151                                 lTENeighborListInUseLTECellElement.setBlacklisted(lteRanElement.isBlacklisted().toString());
152                                 lTENeighborListInUseLTECellElement.setCid(lteRanElement.getCid());
153                                 lTENeighborListInUseLTECellElement.setEnable(TRUE);
154                                 lTENeighborListInUseLTECellElement.setMustInclude(TRUE);
155                                 lTENeighborListInUseLTECellElement.setPhyCellId(lteRanElement.getPhyCellId().toString());
156                                 lTENeighborListInUseLTECellElement.setPlmnid(lteRanElement.getPlmnid());
157                                 lTENeighborListInUseLTECellElement.setPnfName(lteRanElement.getPnfName());
158
159                                 lTENeighborListInUseLTECell.add(lTENeighborListInUseLTECellElement);
160                         }
161
162                         NeighborListInUse neighborListInUse = new NeighborListInUse();
163                         neighborListInUse.setLTECellNumberOfEntries(
164                                         String.valueOf(fapSvc.getLteRanNeighborListInUseLteCellChanged().size()));
165                         neighborListInUse.setLTENeighborListInUseLTECell(lTENeighborListInUseLTECell);
166
167                         CellConfig cellConfig = new CellConfig();
168                         LTE lTE = new LTE();
169                         RAN rAN = new RAN();
170
171                         rAN.setCellIdentity(fapSvc.getCid());
172                         rAN.setNeighborListInUse(neighborListInUse);
173
174                         lTE.setRAN(rAN);
175                         cellConfig.setLTE(lTE);
176                         fapServiceElement.setCellConfig(cellConfig);
177
178                         fAPServiceList.add(fapServiceElement);
179                 }
180                 radioAccess.setFAPServiceList(fAPServiceList);
181                 payload.setRadioAccess(radioAccess);
182                 payloadObject.setPayload(payload);
183
184                 ObjectMapper mapper = new ObjectMapper();
185
186                 try {
187                         payloadString = mapper.writeValueAsString(payloadObject.getPayload());
188                         LOG.info("Stringified Payload Object::" + payloadString + "\n" + "\n");
189                 } catch (JsonProcessingException jsonProcessingException) {
190                         LOG.error("Error while processing Payload Object", jsonProcessingException);
191                         return;
192                 }
193
194                 // END: Create RadioAccess payload object/string from the notification
195
196                 // START: Build RPC message and invoke RPC
197
198                 String rpcMessageBody = null;
199
200                 try {
201                         rpcMessageBody = buildHandleNbrlistChangeNotifRPCMsg(radioAccess, payloadString, "/opt/onap/ccsdk/data/properties/rpc-message-sliapi-execute.vt");
202                         LOG.debug("rpc message body::" + rpcMessageBody);
203                         invokeRPC(rpcMessageBody);
204                 } catch (Exception e) {
205                         LOG.error("Unable to build rpc message body::", e);
206                         return;
207                 }
208         }
209         private void invokeRPC(String rpcMsgbody) {
210                 try {
211             String odlUrlBase = "http://sdnc.onap:8282/restconf/operations"; //using cluster SDNC URL
212             String odlUser = "admin";
213             String odlPassword = "Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U";
214             String sdncEndpoint = " SLI-API:execute-graph";
215
216             if ((odlUrlBase != null) && (odlUrlBase.length() > 0)) {
217                 SdncOdlConnection conn = SdncOdlConnection.newInstance(odlUrlBase + "/" + sdncEndpoint, odlUser, odlPassword);
218
219                 conn.send("POST", "application/json", rpcMsgbody);
220             } else {
221                 LOG.info("POST message body would be:\n" + rpcMsgbody);
222             }
223         } catch (Exception e) {
224             LOG.error("Unable to process message", e);
225         }
226         }
227
228         private String buildHandleNbrlistChangeNotifRPCMsg(RadioAccess radioAccess, String payloadString, String templatePath) throws IOException {
229                 VelocityEngine velocityEngine = new VelocityEngine();
230                 velocityEngine.init();
231
232                 String SLI_PARAMETERS = "sli_parameters";
233                 String HANDLE_NBRLIST_CHANGE_NOTIF = "handle-nbrlist-change-notif";
234                 String HANDLE_NBRLIST_CHANGE_NOTIF_INPUT = HANDLE_NBRLIST_CHANGE_NOTIF+"-input.";
235                 String HANDLE_NBRLIST_CHANGE_NOTIF_INPUT_FAP_SERVICE = HANDLE_NBRLIST_CHANGE_NOTIF_INPUT+"fap-service";
236                 String FAP_SERVICE_NO_OF_ENTRIES_CHANGED= "fap-service-number-of-entries-changed";
237
238                 JSONArray sliParametersArray = new JSONArray();
239
240                 VelocityContext context = new VelocityContext();
241                 context.put("rpc_name", "handle-nbrlist-change-notif");
242
243                 sliParametersArray.put(new JSONObject().put(PARAMETER_NAME, HANDLE_NBRLIST_CHANGE_NOTIF_INPUT+FAP_SERVICE_NO_OF_ENTRIES_CHANGED)
244                         .put(STRING_VALUE, radioAccess.getFAPServiceNumberOfEntries()));
245
246                 int count = 0;
247
248                 for(FAPServiceList fapServiceListElement: radioAccess.getFAPServiceList()) {
249
250                         String prefix = HANDLE_NBRLIST_CHANGE_NOTIF_INPUT_FAP_SERVICE+"["+count+"].";
251
252                         sliParametersArray.put(new JSONObject().put(PARAMETER_NAME, prefix+"alias")
253                                 .put(STRING_VALUE, fapServiceListElement.getAlias()));
254                         sliParametersArray.put(new JSONObject().put(PARAMETER_NAME, prefix+"cid")
255                                 .put(STRING_VALUE, fapServiceListElement.getAlias()));
256                         sliParametersArray.put(new JSONObject().put(PARAMETER_NAME, prefix+"phy-cell-id-in-use")
257                                 .put(STRING_VALUE, fapServiceListElement.getX0005b9Lte().getPhyCellIdInUse()));
258                         sliParametersArray.put(new JSONObject().put(PARAMETER_NAME, prefix+"pnf-name")
259                                 .put(STRING_VALUE, fapServiceListElement.getX0005b9Lte().getPnfName()));
260
261                         sliParametersArray.put(new JSONObject().put(PARAMETER_NAME, prefix+"lte-cell-number-of-entries")
262                                 .put(STRING_VALUE, fapServiceListElement.getCellConfig().getLTE().getRAN().getNeighborListInUse().getLTECellNumberOfEntries()));
263
264                         int lteNbrListInUseCount = 0;
265                         for(LTENeighborListInUseLTECell lTENeighborListInUseLTECellElement: fapServiceListElement.getCellConfig().getLTE().getRAN().getNeighborListInUse().getLTENeighborListInUseLTECell()) {
266                                 String lteNbrListPrefix = "lte-ran-neighbor-list-in-use-lte-cell-changed["+lteNbrListInUseCount+"].";
267                                 sliParametersArray.put(new JSONObject().put(PARAMETER_NAME, prefix+lteNbrListPrefix+"plmnid")
268                                         .put(STRING_VALUE, lTENeighborListInUseLTECellElement.getPlmnid()));
269                                 sliParametersArray.put(new JSONObject().put(PARAMETER_NAME, prefix+lteNbrListPrefix+"cid")
270                                         .put(STRING_VALUE, lTENeighborListInUseLTECellElement.getCid()));
271                                 sliParametersArray.put(new JSONObject().put(PARAMETER_NAME, prefix+lteNbrListPrefix+"phy-cell-id")
272                                         .put(STRING_VALUE, lTENeighborListInUseLTECellElement.getPhyCellId()));
273                                 sliParametersArray.put(new JSONObject().put(PARAMETER_NAME, prefix+lteNbrListPrefix+"pnf-name")
274                                         .put(STRING_VALUE, lTENeighborListInUseLTECellElement.getPnfName()));
275                                 sliParametersArray.put(new JSONObject().put(PARAMETER_NAME, prefix+lteNbrListPrefix+"blacklisted")
276                                         .put(STRING_VALUE, lTENeighborListInUseLTECellElement.getBlacklisted()));
277                                 lteNbrListInUseCount++;
278                         }
279
280                         count++;
281                 }
282
283                 sliParametersArray.put(new JSONObject().put(PARAMETER_NAME, HANDLE_NBRLIST_CHANGE_NOTIF_INPUT+"payload")
284                         .put(STRING_VALUE, payloadString));
285
286                 context.put(SLI_PARAMETERS, sliParametersArray);
287
288                 Writer writer = new StringWriter();
289                 velocityEngine.mergeTemplate(templatePath, UTF_8, context, writer);
290                 writer.flush();
291
292                 return writer.toString();
293         }
294
295         @Override
296         public void onNetconfConfigChange(final NetconfConfigChange notification) {
297
298         }
299
300 }