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