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