68352c1b1d5f623523201f935bf126600ba51a38
[appc.git] / appc-dispatcher / appc-request-handler / appc-request-handler-core / src / main / java / org / onap / appc / requesthandler / conv / Converter.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP : APPC
4  * ================================================================================
5  * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Copyright (C) 2017 Amdocs
8  * =============================================================================
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  * 
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  * 
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  * 
21  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22  * ============LICENSE_END=========================================================
23  */
24
25 package org.onap.appc.requesthandler.conv;
26
27 import com.att.eelf.configuration.EELFLogger;
28 import com.att.eelf.configuration.EELFManager;
29
30 import com.fasterxml.jackson.annotation.JsonIgnore;
31 import com.fasterxml.jackson.annotation.JsonInclude;
32 import com.fasterxml.jackson.annotation.JsonProperty;
33 import com.fasterxml.jackson.annotation.JsonValue;
34 import com.fasterxml.jackson.core.JsonProcessingException;
35 import com.fasterxml.jackson.databind.MapperFeature;
36 import com.fasterxml.jackson.databind.ObjectMapper;
37 import com.fasterxml.jackson.databind.ObjectWriter;
38 import com.fasterxml.jackson.databind.SerializationFeature;
39 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.*;
40 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeader;
41 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeaderBuilder;
42 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags;
43 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.FlagsBuilder;
44 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.Status;
45 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.StatusBuilder;
46 import org.opendaylight.yangtools.concepts.Builder;
47 import org.opendaylight.yangtools.yang.binding.DataContainer;
48 import org.onap.appc.domainmodel.lcm.ResponseContext;
49 import org.onap.appc.domainmodel.lcm.VNFOperation;
50 import org.onap.appc.requesthandler.impl.DmaapOutgoingMessage;
51
52 import java.text.ParseException;
53 import java.text.SimpleDateFormat;
54 import java.util.Date;
55 import java.util.TimeZone;
56
57
58 public class Converter {
59     private static final String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
60     private final static String DMaaP_ROOT_VALUE = "output";
61     private static final SimpleDateFormat isoFormatter = new SimpleDateFormat(ISO_FORMAT);
62     static {
63         isoFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
64     }
65
66     public static Builder<?> convAsyncResponseToBuilder(VNFOperation vnfOperation, String rpcName, ResponseContext response) {
67         Builder<?> outObj = null;
68         if(response == null){
69             throw new IllegalArgumentException("empty asyncResponse");
70         }
71         if(vnfOperation == null){
72             throw new IllegalArgumentException("empty asyncResponse.action");
73         }
74         Action action = Action.valueOf(vnfOperation.name());
75         CommonHeader commonHeader = convAsyncResponseTorev160108CommonHeader(response);
76         Status status = convAsyncResponseTorev160108Status(response);
77         Payload payload = convAsyncResponseTorev160108Payload(response);
78         switch (action){
79             case Rollback:
80                 outObj = new RollbackOutputBuilder();
81                 ((RollbackOutputBuilder)outObj).setCommonHeader(commonHeader);
82                 ((RollbackOutputBuilder)outObj).setStatus(status);
83                 return outObj;
84             case Snapshot:
85                 outObj = new SnapshotOutputBuilder();
86                 ((SnapshotOutputBuilder)outObj).setCommonHeader(commonHeader);
87                 ((SnapshotOutputBuilder)outObj).setStatus(status);
88                 try {
89                     ((SnapshotOutputBuilder) outObj).setSnapshotId(response.getAdditionalContext().get("output.snapshot-id"));
90                 } catch (NullPointerException ignored) {
91                     // in case of negative response, snapshotID does not populated, so just ignore NPL
92                 }
93                 return outObj;
94             case Audit:
95                 outObj = new AuditOutputBuilder();
96                 ((AuditOutputBuilder)outObj).setCommonHeader(commonHeader);
97                 ((AuditOutputBuilder)outObj).setStatus(status);
98                 ((AuditOutputBuilder)outObj).setPayload(payload);
99                 return outObj;
100             case HealthCheck:
101                 outObj = new HealthCheckOutputBuilder();
102                 ((HealthCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
103                 ((HealthCheckOutputBuilder)outObj).setStatus(status);
104                 return outObj;
105             case LiveUpgrade:
106                 outObj = new LiveUpgradeOutputBuilder();
107                 ((LiveUpgradeOutputBuilder)outObj).setCommonHeader(commonHeader);
108                 ((LiveUpgradeOutputBuilder)outObj).setStatus(status);
109                 return outObj;
110             case Lock:
111                 outObj = new LockOutputBuilder();
112                 ((LockOutputBuilder)outObj).setCommonHeader(commonHeader);
113                 ((LockOutputBuilder)outObj).setStatus(status);
114                 return outObj;
115             case Configure:
116                 outObj = new ConfigureOutputBuilder();
117                 ((ConfigureOutputBuilder)outObj).setCommonHeader(commonHeader);
118                 ((ConfigureOutputBuilder)outObj).setStatus(status);
119                 ((ConfigureOutputBuilder)outObj).setPayload(payload);
120                 return outObj;
121             case ConfigModify:
122                 outObj = new ConfigModifyOutputBuilder();
123                 ((ConfigModifyOutputBuilder)outObj).setCommonHeader(commonHeader);
124                 ((ConfigModifyOutputBuilder)outObj).setStatus(status);
125                 ((ConfigModifyOutputBuilder)outObj).setPayload(payload);
126                 return outObj;
127             case ConfigScaleOut:
128                 outObj = new ConfigScaleOutOutputBuilder();
129                 ((ConfigScaleOutOutputBuilder)outObj).setCommonHeader(commonHeader);
130                 ((ConfigScaleOutOutputBuilder)outObj).setStatus(status);
131                 ((ConfigScaleOutOutputBuilder)outObj).setPayload(payload);
132                 return outObj;
133             case ConfigRestore:
134                 outObj = new ConfigRestoreOutputBuilder();
135                 ((ConfigRestoreOutputBuilder)outObj).setCommonHeader(commonHeader);
136                 ((ConfigRestoreOutputBuilder)outObj).setStatus(status);
137                 ((ConfigRestoreOutputBuilder)outObj).setPayload(payload);
138                 return outObj;
139             case SoftwareUpload:
140                 outObj = new SoftwareUploadOutputBuilder();
141                 ((SoftwareUploadOutputBuilder)outObj).setCommonHeader(commonHeader);
142                 ((SoftwareUploadOutputBuilder)outObj).setStatus(status);
143                 return outObj;
144             case Stop:
145                 outObj = new StopOutputBuilder();
146                 ((StopOutputBuilder)outObj).setCommonHeader(commonHeader);
147                 ((StopOutputBuilder)outObj).setStatus(status);
148                 return outObj;
149             case Sync:
150                 outObj = new SyncOutputBuilder();
151                 ((SyncOutputBuilder)outObj).setCommonHeader(commonHeader);
152                 ((SyncOutputBuilder)outObj).setStatus(status);
153                 ((SyncOutputBuilder)outObj).setPayload(payload);
154                 return outObj;
155             case Terminate:
156                 outObj = new TerminateOutputBuilder();
157                 ((TerminateOutputBuilder)outObj).setCommonHeader(commonHeader);
158                 ((TerminateOutputBuilder)outObj).setStatus(status);
159                 return outObj;
160             case Test:
161                 outObj = new TestOutputBuilder();
162                 ((TestOutputBuilder)outObj).setCommonHeader(commonHeader);
163                 ((TestOutputBuilder)outObj).setStatus(status);
164                 return outObj;
165             case Unlock:
166                 outObj = new UnlockOutputBuilder();
167                 ((UnlockOutputBuilder)outObj).setCommonHeader(commonHeader);
168                 ((UnlockOutputBuilder)outObj).setStatus(status);
169                 return outObj;
170             case Restart:
171                 outObj = new RestartOutputBuilder();
172                 ((RestartOutputBuilder)outObj).setCommonHeader(commonHeader);
173                 ((RestartOutputBuilder)outObj).setStatus(status);
174                 return outObj;
175             case Rebuild:
176                 outObj = new RebuildOutputBuilder();
177                 ((RebuildOutputBuilder)outObj).setCommonHeader(commonHeader);
178                 ((RebuildOutputBuilder)outObj).setStatus(status);
179                 return outObj;
180             case Migrate:
181                 outObj = new MigrateOutputBuilder();
182                 ((MigrateOutputBuilder)outObj).setCommonHeader(commonHeader);
183                 ((MigrateOutputBuilder)outObj).setStatus(status);
184                 return outObj;
185             case Evacuate:
186                 outObj = new EvacuateOutputBuilder();
187                 ((EvacuateOutputBuilder)outObj).setCommonHeader(commonHeader);
188                 ((EvacuateOutputBuilder)outObj).setStatus(status);
189                 return outObj;
190             case ConfigBackup:
191                 outObj = new ConfigBackupOutputBuilder();
192                 ((ConfigBackupOutputBuilder)outObj).setCommonHeader(commonHeader);
193                 ((ConfigBackupOutputBuilder)outObj).setStatus(status);
194                 ((ConfigBackupOutputBuilder)outObj).setPayload(payload);
195                 return outObj;
196             case ConfigBackupDelete:
197                 outObj = new ConfigBackupDeleteOutputBuilder();
198                 ((ConfigBackupDeleteOutputBuilder)outObj).setCommonHeader(commonHeader);
199                 ((ConfigBackupDeleteOutputBuilder)outObj).setStatus(status);
200                 ((ConfigBackupDeleteOutputBuilder)outObj).setPayload(payload);
201                 return outObj;
202             case ConfigExport:
203                 outObj = new ConfigExportOutputBuilder();
204                 ((ConfigExportOutputBuilder)outObj).setCommonHeader(commonHeader);
205                 ((ConfigExportOutputBuilder)outObj).setStatus(status);
206                 return outObj;
207             case Start:
208                 outObj = new StartOutputBuilder();
209                 ((StartOutputBuilder)outObj).setCommonHeader(commonHeader);
210                 ((StartOutputBuilder)outObj).setStatus(status);
211                 return outObj;
212             case StopApplication:
213                 outObj = new StopApplicationOutputBuilder();
214                 ((StopApplicationOutputBuilder)outObj).setCommonHeader(commonHeader);
215                 ((StopApplicationOutputBuilder)outObj).setStatus(status);
216                 return outObj;
217             case StartApplication:
218                 outObj = new StartApplicationOutputBuilder();
219                 ((StartApplicationOutputBuilder)outObj).setCommonHeader(commonHeader);
220                 ((StartApplicationOutputBuilder)outObj).setStatus(status);
221                 return outObj;
222     case QuiesceTraffic:
223                 outObj = new QuiesceTrafficOutputBuilder();
224                 ((QuiesceTrafficOutputBuilder)outObj).setCommonHeader(commonHeader);
225                 ((QuiesceTrafficOutputBuilder)outObj).setStatus(status);
226                 return outObj;
227             case ResumeTraffic:
228                 outObj = new ResumeTrafficOutputBuilder();
229                 ((ResumeTrafficOutputBuilder)outObj).setCommonHeader(commonHeader);
230                 ((ResumeTrafficOutputBuilder)outObj).setStatus(status);
231                 return outObj;
232             case UpgradeSoftware:
233                 outObj = new UpgradeSoftwareOutputBuilder();
234                 ((UpgradeSoftwareOutputBuilder)outObj).setCommonHeader(commonHeader);
235                 ((UpgradeSoftwareOutputBuilder)outObj).setStatus(status);
236                 return outObj;
237             case UpgradePostCheck:
238                 outObj = new UpgradePostCheckOutputBuilder();
239                 ((UpgradePostCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
240                 ((UpgradePostCheckOutputBuilder)outObj).setStatus(status);
241                 return outObj;
242             case UpgradeBackup:
243                 outObj = new UpgradeBackupOutputBuilder();
244                 ((UpgradeBackupOutputBuilder)outObj).setCommonHeader(commonHeader);
245                 ((UpgradeBackupOutputBuilder)outObj).setStatus(status);
246                 return outObj;
247             case UpgradeBackout:
248                 outObj = new UpgradeBackoutOutputBuilder();
249                 ((UpgradeBackoutOutputBuilder)outObj).setCommonHeader(commonHeader);
250                 ((UpgradeBackoutOutputBuilder)outObj).setStatus(status);
251                 return outObj;
252             case UpgradePreCheck:
253                 outObj = new UpgradePreCheckOutputBuilder();
254                 ((UpgradePreCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
255                 ((UpgradePreCheckOutputBuilder)outObj).setStatus(status);
256                 return outObj;
257             default:
258                 throw new IllegalArgumentException(action+" action is not supported");
259         }
260     }
261
262     public static Payload convAsyncResponseTorev160108Payload(ResponseContext inObj)  {
263         Payload payload = null;
264         if(inObj.getPayload() != null) {
265             payload = new Payload(inObj.getPayload());
266         }
267         return payload;
268     }
269
270     public static String convPayloadObjectToJsonString(Object inObj) throws ParseException {
271         String payloadAsString = null;
272         if(inObj != null) {
273
274                 if(inObj instanceof String){
275                     payloadAsString = (String)inObj;
276                 }else {
277                     try {
278                         ObjectMapper objectMapper = new ObjectMapper();
279                         payloadAsString = objectMapper.writeValueAsString(inObj);
280                     } catch (JsonProcessingException e) {
281                         String errMsg = "Error serialize payload json to string";
282                         throw new ParseException(errMsg + "-" + e.toString(), 0);
283                     }
284                 }
285         }
286         return payloadAsString;
287     }
288
289     public static Status convAsyncResponseTorev160108Status(ResponseContext inObj) {
290         StatusBuilder statusBuilder = new StatusBuilder();
291         statusBuilder.setCode(inObj.getStatus().getCode());
292         statusBuilder.setMessage(inObj.getStatus().getMessage());
293         return statusBuilder.build();
294     }
295
296     public static CommonHeader convAsyncResponseTorev160108CommonHeader(ResponseContext inObj) {
297         CommonHeader outObj = null;
298         if(inObj == null){
299             throw new IllegalArgumentException("empty asyncResponse");
300         }
301
302         CommonHeaderBuilder commonHeaderBuilder = new CommonHeaderBuilder();
303         org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags commonHeaderFlags;
304         if(inObj.getCommonHeader().getFlags() != null){
305             commonHeaderFlags = Converter.convFlagsMapTorev160108Flags(inObj.getCommonHeader().getFlags());
306             commonHeaderBuilder.setFlags(commonHeaderFlags);
307         }
308
309
310         commonHeaderBuilder.setApiVer(inObj.getCommonHeader().getApiVer());
311         commonHeaderBuilder.setRequestId(inObj.getCommonHeader().getRequestId());
312         if(inObj.getCommonHeader().getSubRequestId() != null){
313             commonHeaderBuilder.setSubRequestId(inObj.getCommonHeader().getSubRequestId());
314         }
315
316         if(inObj.getCommonHeader().getOriginatorId() != null){
317             commonHeaderBuilder.setOriginatorId(inObj.getCommonHeader().getOriginatorId());
318         }
319
320         if(inObj.getCommonHeader().getTimeStamp() != null){
321             String zuluTimestampStr = Converter.convDateToZuluString(inObj.getCommonHeader().getTimeStamp());
322             ZULU zuluTimestamp = new ZULU(zuluTimestampStr);
323             commonHeaderBuilder.setTimestamp(zuluTimestamp);
324         }
325         outObj = commonHeaderBuilder.build();
326         return outObj;
327
328     }
329
330     public static String convDateToZuluString(Date timeStamp) {
331         return isoFormatter.format(timeStamp);
332     }
333
334     public static org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags
335     convFlagsMapTorev160108Flags(org.onap.appc.domainmodel.lcm.Flags flags) {
336         Flags rev160108flags;
337         boolean anyFlag = false;
338         FlagsBuilder flagsBuilder = new FlagsBuilder();
339         /*
340          * TODO: The below flags are related to APP-C request and should not be sent back - uncomment when response flags are introduced.
341          */
342         /*
343         if(flags.containsKey(FORCE_FLAG)){
344             org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Force force =
345                     org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Force.valueOf(flags.get(FORCE_FLAG).toString());
346             flagsBuilder.setForce(force);
347             anyFlag = true;
348         }
349         if(flags.containsKey(MODE_FLAG)){
350             org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Mode mode =
351                     org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Mode.valueOf(flags.get(MODE_FLAG).toString());
352             flagsBuilder.setMode(mode);
353             anyFlag = true;
354         }
355         if(flags.containsKey(TTL_FLAG)){
356             flagsBuilder.setTtl(Integer.valueOf(flags.get(TTL_FLAG).toString()));
357             anyFlag = true;
358         }
359         if(anyFlag){
360             rev160108flags = flagsBuilder.build();
361         }
362          */
363
364         rev160108flags = flagsBuilder.build();
365         return rev160108flags;
366     }
367
368     public static String convAsyncResponseToJsonStringBody(VNFOperation vnfOperation, String rpcName, ResponseContext asyncResponse) throws JsonProcessingException {
369         Builder<?> builder = Converter.convAsyncResponseToBuilder(vnfOperation, rpcName, asyncResponse);
370         Object message = builder.build();
371         ObjectMapper objectMapper = new ObjectMapper();
372         objectMapper.addMixInAnnotations(message.getClass(), MixInFlagsMessage.class);
373         objectMapper.addMixInAnnotations(CommonHeader.class, MixInCommonHeader.class);
374         objectMapper.addMixInAnnotations(Flags.class, MixIn.class);
375         objectMapper.addMixInAnnotations(Status.class, MixIn.class);
376         objectMapper.addMixInAnnotations(Payload.class, MixIn.class);
377         objectMapper.addMixInAnnotations(ZULU.class, MixIn.class);
378
379 //                .configure(SerializationConfig.Feature.SORT_PROPERTIES_ALPHABETICALLY,true)
380         ObjectWriter writer = objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL).configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY,true)
381                 .writer(SerializationFeature.WRAP_ROOT_VALUE).withRootName(DMaaP_ROOT_VALUE).withoutFeatures(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS);
382         return writer.writeValueAsString(message);
383     }
384
385     public static String convAsyncResponseToDmaapOutgoingMessageJsonString(VNFOperation vnfOperation, String rpcName, ResponseContext asyncResponse) throws JsonProcessingException {
386         DmaapOutgoingMessage dmaapOutgoingMessage = convAsyncResponseToDmaapOutgoingMessage(vnfOperation, rpcName, asyncResponse);
387         ObjectMapper objectMapper = new ObjectMapper();
388         objectMapper.addMixInAnnotations(dmaapOutgoingMessage.getBody().getOutput().getClass(), MixInFlagsMessage.class);
389         objectMapper.addMixInAnnotations(CommonHeader.class, MixInCommonHeader.class);
390         objectMapper.addMixInAnnotations(Flags.class, MixIn.class);
391         objectMapper.addMixInAnnotations(Status.class, MixIn.class);
392         objectMapper.addMixInAnnotations(Payload.class, MixIn.class);
393         objectMapper.addMixInAnnotations(ZULU.class, MixIn.class);
394
395 //                .configure(SerializationConfig.Feature.SORT_PROPERTIES_ALPHABETICALLY,true)
396         ObjectWriter writer = objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL).configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY,true).writer();
397         return writer.writeValueAsString(dmaapOutgoingMessage);
398     }
399
400     public static DmaapOutgoingMessage convAsyncResponseToDmaapOutgoingMessage(VNFOperation vnfOperation, String rpcName, ResponseContext asyncResponse) throws JsonProcessingException {
401         DmaapOutgoingMessage outObj = new DmaapOutgoingMessage();
402         String correlationID = getCorrelationID(asyncResponse);
403         outObj.setCorrelationID(correlationID);
404         outObj.setType("response");
405         outObj.setRpcName(rpcName);
406         Builder<?> builder = Converter.convAsyncResponseToBuilder(vnfOperation, rpcName, asyncResponse);
407         Object messageBody = builder.build();
408         DmaapOutgoingMessage.Body body = new DmaapOutgoingMessage.Body(messageBody);
409         outObj.setBody(body);
410         return outObj;
411     }
412
413     private static String getCorrelationID(ResponseContext context) {
414         return context.getCommonHeader().getRequestId()
415                 + (context.getCommonHeader().getSubRequestId() == null ?
416                     "":"-" + context.getCommonHeader().getSubRequestId());
417     }
418
419     abstract class MixIn {
420         @JsonIgnore
421         abstract Class<? extends DataContainer> getImplementedInterface(); // to be removed during serialization
422
423         @JsonValue
424         abstract java.lang.String getValue();
425     }
426     abstract class MixInCommonHeader extends MixIn {
427         @JsonProperty("api-ver")
428         abstract java.lang.String getApiVer();
429         @JsonProperty("originator-id")
430         abstract java.lang.String getOriginatorId();
431         @JsonProperty("request-id")
432         abstract java.lang.String getRequestId();
433         @JsonProperty("sub-request-id")
434         abstract java.lang.String getSubRequestId();
435
436     }
437     abstract class MixInFlagsMessage extends MixIn {
438         @JsonProperty("common-header")
439         abstract  CommonHeader getCommonHeader();
440     }
441 }