2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Copyright (C) 2017 Amdocs
8 * ================================================================================
9 * Modifications Copyright (C) 2018-2019 Orange
10 * =============================================================================
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
15 * http://www.apache.org/licenses/LICENSE-2.0
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
23 * ============LICENSE_END=========================================================
26 package org.onap.appc.requesthandler.conv;
28 import com.att.aft.dme2.internal.apache.commons.lang3.StringUtils;
29 import com.att.eelf.configuration.EELFLogger;
30 import com.att.eelf.configuration.EELFManager;
32 import com.fasterxml.jackson.annotation.JsonIgnore;
33 import com.fasterxml.jackson.annotation.JsonInclude;
34 import com.fasterxml.jackson.annotation.JsonProperty;
35 import com.fasterxml.jackson.annotation.JsonValue;
36 import com.fasterxml.jackson.core.JsonProcessingException;
37 import com.fasterxml.jackson.databind.MapperFeature;
38 import com.fasterxml.jackson.databind.ObjectMapper;
39 import com.fasterxml.jackson.databind.ObjectWriter;
40 import com.fasterxml.jackson.databind.SerializationFeature;
41 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.*;
42 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeader;
43 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeaderBuilder;
44 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags;
45 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.FlagsBuilder;
46 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.Status;
47 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.StatusBuilder;
48 import org.opendaylight.yangtools.concepts.Builder;
49 import org.opendaylight.yangtools.yang.binding.DataContainer;
50 import org.onap.appc.domainmodel.lcm.ResponseContext;
51 import org.onap.appc.domainmodel.lcm.VNFOperation;
52 import org.onap.appc.requesthandler.impl.AbstractRequestHandlerImpl;
53 import org.onap.appc.requesthandler.impl.DmaapOutgoingMessage;
55 import java.text.ParseException;
56 import java.text.SimpleDateFormat;
57 import java.util.Date;
58 import java.util.TimeZone;
61 public class Converter {
62 private static final String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
63 private final static String DMaaP_ROOT_VALUE = "output";
64 private static final SimpleDateFormat isoFormatter = new SimpleDateFormat(ISO_FORMAT);
65 private final static EELFLogger logger = EELFManager.getInstance().getLogger(Converter.class);
67 isoFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
70 public static Builder<?> convAsyncResponseToBuilder(VNFOperation vnfOperation, String rpcName, ResponseContext response) {
71 Builder<?> outObj = null;
73 throw new IllegalArgumentException("empty asyncResponse");
75 if(vnfOperation == null){
76 throw new IllegalArgumentException("empty asyncResponse.action");
78 logger.debug("Entered Converter.convAsyncResponseToBuilder() : Operation Name "+ vnfOperation.name());
79 org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action action = org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action.valueOf(vnfOperation.name());
80 logger.debug("After resolving action");
81 CommonHeader commonHeader = convAsyncResponseTorev160108CommonHeader(response);
82 Status status = convAsyncResponseTorev160108Status(response);
83 Payload payload = convAsyncResponseTorev160108Payload(response);
84 logger.debug("Extracted action, status, payload ");
87 outObj = new RollbackOutputBuilder();
88 ((RollbackOutputBuilder)outObj).setCommonHeader(commonHeader);
89 ((RollbackOutputBuilder)outObj).setStatus(status);
92 outObj = new SnapshotOutputBuilder();
93 ((SnapshotOutputBuilder)outObj).setCommonHeader(commonHeader);
94 ((SnapshotOutputBuilder)outObj).setStatus(status);
96 ((SnapshotOutputBuilder) outObj).setSnapshotId(response.getAdditionalContext().get("output.snapshot-id"));
97 } catch (NullPointerException ignored) {
98 // in case of negative response, snapshotID does not populated, so just ignore NPL
102 outObj = new AuditOutputBuilder();
103 ((AuditOutputBuilder)outObj).setCommonHeader(commonHeader);
104 ((AuditOutputBuilder)outObj).setStatus(status);
105 ((AuditOutputBuilder)outObj).setPayload(payload);
108 outObj = new HealthCheckOutputBuilder();
109 ((HealthCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
110 ((HealthCheckOutputBuilder)outObj).setStatus(status);
111 ((HealthCheckOutputBuilder)outObj).setPayload(payload);
112 logger.debug("In HealthCheck case- created outObj, returning");
115 outObj = new LiveUpgradeOutputBuilder();
116 ((LiveUpgradeOutputBuilder)outObj).setCommonHeader(commonHeader);
117 ((LiveUpgradeOutputBuilder)outObj).setStatus(status);
120 outObj = new LockOutputBuilder();
121 ((LockOutputBuilder)outObj).setCommonHeader(commonHeader);
122 ((LockOutputBuilder)outObj).setStatus(status);
125 outObj = new ConfigureOutputBuilder();
126 ((ConfigureOutputBuilder)outObj).setCommonHeader(commonHeader);
127 ((ConfigureOutputBuilder)outObj).setStatus(status);
128 ((ConfigureOutputBuilder)outObj).setPayload(payload);
131 outObj = new ConfigModifyOutputBuilder();
132 ((ConfigModifyOutputBuilder)outObj).setCommonHeader(commonHeader);
133 ((ConfigModifyOutputBuilder)outObj).setStatus(status);
134 ((ConfigModifyOutputBuilder)outObj).setPayload(payload);
137 outObj = new ConfigScaleOutOutputBuilder();
138 ((ConfigScaleOutOutputBuilder)outObj).setCommonHeader(commonHeader);
139 ((ConfigScaleOutOutputBuilder)outObj).setStatus(status);
140 ((ConfigScaleOutOutputBuilder)outObj).setPayload(payload);
143 outObj = new ConfigRestoreOutputBuilder();
144 ((ConfigRestoreOutputBuilder)outObj).setCommonHeader(commonHeader);
145 ((ConfigRestoreOutputBuilder)outObj).setStatus(status);
146 ((ConfigRestoreOutputBuilder)outObj).setPayload(payload);
149 outObj = new SoftwareUploadOutputBuilder();
150 ((SoftwareUploadOutputBuilder)outObj).setCommonHeader(commonHeader);
151 ((SoftwareUploadOutputBuilder)outObj).setStatus(status);
154 outObj = new StopOutputBuilder();
155 ((StopOutputBuilder)outObj).setCommonHeader(commonHeader);
156 ((StopOutputBuilder)outObj).setStatus(status);
159 outObj = new SyncOutputBuilder();
160 ((SyncOutputBuilder)outObj).setCommonHeader(commonHeader);
161 ((SyncOutputBuilder)outObj).setStatus(status);
162 ((SyncOutputBuilder)outObj).setPayload(payload);
165 outObj = new TerminateOutputBuilder();
166 ((TerminateOutputBuilder)outObj).setCommonHeader(commonHeader);
167 ((TerminateOutputBuilder)outObj).setStatus(status);
170 outObj = new TestOutputBuilder();
171 ((TestOutputBuilder)outObj).setCommonHeader(commonHeader);
172 ((TestOutputBuilder)outObj).setStatus(status);
175 outObj = new UnlockOutputBuilder();
176 ((UnlockOutputBuilder)outObj).setCommonHeader(commonHeader);
177 ((UnlockOutputBuilder)outObj).setStatus(status);
180 outObj = new RestartOutputBuilder();
181 ((RestartOutputBuilder)outObj).setCommonHeader(commonHeader);
182 ((RestartOutputBuilder)outObj).setStatus(status);
185 outObj = new RebuildOutputBuilder();
186 ((RebuildOutputBuilder)outObj).setCommonHeader(commonHeader);
187 ((RebuildOutputBuilder)outObj).setStatus(status);
190 outObj = new RebootOutputBuilder();
191 ((RebootOutputBuilder)outObj).setCommonHeader(commonHeader);
192 ((RebootOutputBuilder)outObj).setStatus(status);
195 outObj = new MigrateOutputBuilder();
196 ((MigrateOutputBuilder)outObj).setCommonHeader(commonHeader);
197 ((MigrateOutputBuilder)outObj).setStatus(status);
200 outObj = new EvacuateOutputBuilder();
201 ((EvacuateOutputBuilder)outObj).setCommonHeader(commonHeader);
202 ((EvacuateOutputBuilder)outObj).setStatus(status);
205 outObj = new ConfigBackupOutputBuilder();
206 ((ConfigBackupOutputBuilder)outObj).setCommonHeader(commonHeader);
207 ((ConfigBackupOutputBuilder)outObj).setStatus(status);
208 ((ConfigBackupOutputBuilder)outObj).setPayload(payload);
210 case ConfigBackupDelete:
211 outObj = new ConfigBackupDeleteOutputBuilder();
212 ((ConfigBackupDeleteOutputBuilder)outObj).setCommonHeader(commonHeader);
213 ((ConfigBackupDeleteOutputBuilder)outObj).setStatus(status);
214 ((ConfigBackupDeleteOutputBuilder)outObj).setPayload(payload);
217 outObj = new ConfigExportOutputBuilder();
218 ((ConfigExportOutputBuilder)outObj).setCommonHeader(commonHeader);
219 ((ConfigExportOutputBuilder)outObj).setStatus(status);
222 outObj = new StartOutputBuilder();
223 ((StartOutputBuilder)outObj).setCommonHeader(commonHeader);
224 ((StartOutputBuilder)outObj).setStatus(status);
226 case StopApplication:
227 outObj = new StopApplicationOutputBuilder();
228 ((StopApplicationOutputBuilder)outObj).setCommonHeader(commonHeader);
229 ((StopApplicationOutputBuilder)outObj).setStatus(status);
231 case StartApplication:
232 outObj = new StartApplicationOutputBuilder();
233 ((StartApplicationOutputBuilder)outObj).setCommonHeader(commonHeader);
234 ((StartApplicationOutputBuilder)outObj).setStatus(status);
237 outObj = new QuiesceTrafficOutputBuilder();
238 ((QuiesceTrafficOutputBuilder)outObj).setCommonHeader(commonHeader);
239 ((QuiesceTrafficOutputBuilder)outObj).setStatus(status);
242 outObj = new ResumeTrafficOutputBuilder();
243 ((ResumeTrafficOutputBuilder)outObj).setCommonHeader(commonHeader);
244 ((ResumeTrafficOutputBuilder)outObj).setStatus(status);
246 case UpgradeSoftware:
247 outObj = new UpgradeSoftwareOutputBuilder();
248 ((UpgradeSoftwareOutputBuilder)outObj).setCommonHeader(commonHeader);
249 ((UpgradeSoftwareOutputBuilder)outObj).setStatus(status);
251 case UpgradePostCheck:
252 outObj = new UpgradePostCheckOutputBuilder();
253 ((UpgradePostCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
254 ((UpgradePostCheckOutputBuilder)outObj).setStatus(status);
255 ((UpgradePostCheckOutputBuilder)outObj).setPayload(payload);
258 outObj = new UpgradeBackupOutputBuilder();
259 ((UpgradeBackupOutputBuilder)outObj).setCommonHeader(commonHeader);
260 ((UpgradeBackupOutputBuilder)outObj).setStatus(status);
263 outObj = new UpgradeBackoutOutputBuilder();
264 ((UpgradeBackoutOutputBuilder)outObj).setCommonHeader(commonHeader);
265 ((UpgradeBackoutOutputBuilder)outObj).setStatus(status);
267 case UpgradePreCheck:
268 outObj = new UpgradePreCheckOutputBuilder();
269 ((UpgradePreCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
270 ((UpgradePreCheckOutputBuilder)outObj).setStatus(status);
271 ((UpgradePreCheckOutputBuilder)outObj).setPayload(payload);
274 outObj = new AttachVolumeOutputBuilder();
275 ((AttachVolumeOutputBuilder)outObj).setCommonHeader(commonHeader);
276 ((AttachVolumeOutputBuilder)outObj).setStatus(status);
279 outObj = new DetachVolumeOutputBuilder();
280 ((DetachVolumeOutputBuilder)outObj).setCommonHeader(commonHeader);
281 ((DetachVolumeOutputBuilder)outObj).setStatus(status);
283 case DistributeTraffic:
284 outObj = new DistributeTrafficOutputBuilder();
285 ((DistributeTrafficOutputBuilder)outObj).setCommonHeader(commonHeader);
286 ((DistributeTrafficOutputBuilder)outObj).setStatus(status);
288 case DistributeTrafficCheck:
289 outObj = new DistributeTrafficCheckOutputBuilder();
290 ((DistributeTrafficCheckOutputBuilder) outObj).setCommonHeader(commonHeader);
291 ((DistributeTrafficCheckOutputBuilder)outObj).setStatus(status);
294 throw new IllegalArgumentException(action+" action is not supported");
298 public static Payload convAsyncResponseTorev160108Payload(ResponseContext inObj) {
299 logger.debug("Entering convAsyncResponseTorev160108Payload" );
300 Payload payload = null;
301 if(inObj.getPayload() != null) {
302 payload = new Payload(inObj.getPayload());
304 logger.debug("Exiting convAsyncResponseTorev160108Payload" );
308 public static String convPayloadObjectToJsonString(Object inObj) throws ParseException {
309 String payloadAsString = null;
312 if(inObj instanceof String){
313 payloadAsString = (String)inObj;
316 ObjectMapper objectMapper = new ObjectMapper();
317 payloadAsString = objectMapper.writeValueAsString(inObj);
318 } catch (JsonProcessingException e) {
319 String errMsg = "Error serialize payload json to string";
320 throw new ParseException(errMsg + "-" + e.toString(), 0);
324 return payloadAsString;
327 public static Status convAsyncResponseTorev160108Status(ResponseContext inObj) {
328 logger.debug("Entering convAsyncResponseTorev160108Status");
329 StatusBuilder statusBuilder = new StatusBuilder();
330 statusBuilder.setCode(inObj.getStatus().getCode());
331 statusBuilder.setMessage(inObj.getStatus().getMessage());
332 logger.debug("Exiting convAsyncResponseTorev160108Status");
333 return statusBuilder.build();
336 public static CommonHeader convAsyncResponseTorev160108CommonHeader(ResponseContext inObj) {
337 logger.debug("Entered into convAsyncResponseTorev160108CommonHeader");
338 CommonHeader outObj = null;
340 throw new IllegalArgumentException("empty asyncResponse");
343 CommonHeaderBuilder commonHeaderBuilder = new CommonHeaderBuilder();
344 org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags commonHeaderFlags;
345 if(inObj.getCommonHeader().getFlags() != null){
346 commonHeaderFlags = Converter.convFlagsMapTorev160108Flags(inObj.getCommonHeader().getFlags());
347 commonHeaderBuilder.setFlags(commonHeaderFlags);
350 logger.debug("Before setApiVer");
351 commonHeaderBuilder.setApiVer(inObj.getCommonHeader().getApiVer());
352 commonHeaderBuilder.setRequestId(inObj.getCommonHeader().getRequestId());
353 if(inObj.getCommonHeader().getSubRequestId() != null){
354 commonHeaderBuilder.setSubRequestId(inObj.getCommonHeader().getSubRequestId());
356 logger.debug("Before getOriginatorId");
357 if(inObj.getCommonHeader().getOriginatorId() != null){
358 commonHeaderBuilder.setOriginatorId(inObj.getCommonHeader().getOriginatorId());
360 logger.debug("Before getTimeStamp");
361 if(inObj.getCommonHeader().getTimeStamp() != null){
362 String zuluTimestampStr = Converter.convDateToZuluString(inObj.getCommonHeader().getTimeStamp());
363 logger.debug("After invoking convDateToZuluString()");
364 ZULU zuluTimestamp = new ZULU(zuluTimestampStr);
365 logger.debug("After ZULU()");
366 commonHeaderBuilder.setTimestamp(zuluTimestamp);
368 outObj = commonHeaderBuilder.build();
369 logger.debug("Exiting from convAsyncResponseTorev160108CommonHeader: Returning outObj::"+outObj.toString());
374 public static String convDateToZuluString(Date timeStamp) {
375 return isoFormatter.format(timeStamp);
378 public static org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags
379 convFlagsMapTorev160108Flags(org.onap.appc.domainmodel.lcm.Flags flags) {
380 Flags rev160108flags;
381 boolean anyFlag = false;
382 FlagsBuilder flagsBuilder = new FlagsBuilder();
384 * TODO: The below flags are related to APP-C request and should not be sent back - uncomment when response flags are introduced.
387 if(flags.containsKey(FORCE_FLAG)){
388 org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Force force =
389 org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Force.valueOf(flags.get(FORCE_FLAG).toString());
390 flagsBuilder.setForce(force);
393 if(flags.containsKey(MODE_FLAG)){
394 org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Mode mode =
395 org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Mode.valueOf(flags.get(MODE_FLAG).toString());
396 flagsBuilder.setMode(mode);
399 if(flags.containsKey(TTL_FLAG)){
400 flagsBuilder.setTtl(Integer.valueOf(flags.get(TTL_FLAG).toString()));
404 rev160108flags = flagsBuilder.build();
408 rev160108flags = flagsBuilder.build();
409 return rev160108flags;
412 public static String convAsyncResponseToJsonStringBody(VNFOperation vnfOperation, String rpcName, ResponseContext asyncResponse) throws JsonProcessingException {
413 Builder<?> builder = Converter.convAsyncResponseToBuilder(vnfOperation, rpcName, asyncResponse);
414 Object message = builder.build();
415 ObjectMapper objectMapper = new ObjectMapper();
416 objectMapper.addMixInAnnotations(message.getClass(), MixInFlagsMessage.class);
417 objectMapper.addMixInAnnotations(CommonHeader.class, MixInCommonHeader.class);
418 objectMapper.addMixInAnnotations(Flags.class, MixIn.class);
419 objectMapper.addMixInAnnotations(Status.class, MixIn.class);
420 objectMapper.addMixInAnnotations(Payload.class, MixIn.class);
421 objectMapper.addMixInAnnotations(ZULU.class, MixIn.class);
423 // .configure(SerializationConfig.Feature.SORT_PROPERTIES_ALPHABETICALLY,true)
424 ObjectWriter writer = objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL).configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY,true)
425 .writer(SerializationFeature.WRAP_ROOT_VALUE).withRootName(DMaaP_ROOT_VALUE).withoutFeatures(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS);
426 return writer.writeValueAsString(message);
429 public static String convAsyncResponseToDmaapOutgoingMessageJsonString(VNFOperation vnfOperation, String rpcName, ResponseContext asyncResponse) throws JsonProcessingException {
430 logger.debug("Entered Converter.convAsyncResponseToDmaapOutgoingMessageJsonString()");
431 DmaapOutgoingMessage dmaapOutgoingMessage = convAsyncResponseToDmaapOutgoingMessage(vnfOperation, rpcName, asyncResponse);
432 ObjectMapper objectMapper = new ObjectMapper();
433 objectMapper.addMixInAnnotations(dmaapOutgoingMessage.getBody().getOutput().getClass(), MixInFlagsMessage.class);
434 objectMapper.addMixInAnnotations(CommonHeader.class, MixInCommonHeader.class);
435 objectMapper.addMixInAnnotations(Flags.class, MixIn.class);
436 objectMapper.addMixInAnnotations(Status.class, MixIn.class);
437 objectMapper.addMixInAnnotations(Payload.class, MixIn.class);
438 objectMapper.addMixInAnnotations(ZULU.class, MixIn.class);
440 // .configure(SerializationConfig.Feature.SORT_PROPERTIES_ALPHABETICALLY,true)
441 ObjectWriter writer = objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL).configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY,true).writer();
442 logger.debug("Exiting Converter.convAsyncResponseToDmaapOutgoingMessageJsonString()");
443 return writer.writeValueAsString(dmaapOutgoingMessage);
446 public static DmaapOutgoingMessage convAsyncResponseToDmaapOutgoingMessage(VNFOperation vnfOperation, String rpcName, ResponseContext asyncResponse) throws JsonProcessingException {
447 logger.debug("Entered Converter.convAsyncResponseToDmaapOutgoingMessage()");
448 DmaapOutgoingMessage outObj = new DmaapOutgoingMessage();
449 String correlationID = getCorrelationID(asyncResponse);
450 outObj.setCorrelationID(correlationID);
451 outObj.setType("response");
452 outObj.setRpcName(rpcName);
453 logger.debug("In onverter.convAsyncResponseToDmaapOutgoingMessage() before invoking convAsyncResponseToBuilder");
454 Builder<?> builder = Converter.convAsyncResponseToBuilder(vnfOperation, rpcName, asyncResponse);
455 Object messageBody = builder.build();
456 DmaapOutgoingMessage.Body body = new DmaapOutgoingMessage.Body(messageBody);
457 outObj.setBody(body);
458 logger.debug("Exiting Converter.convAsyncResponseToDmaapOutgoingMessage():messageBody is :::"+body.toString());
462 private static String getCorrelationID(ResponseContext context) {
463 return context.getCommonHeader().getRequestId()
464 + (context.getCommonHeader().getSubRequestId() == null ?
465 "":"-" + context.getCommonHeader().getSubRequestId());
468 abstract class MixIn {
470 abstract Class<? extends DataContainer> getImplementedInterface(); // to be removed during serialization
473 abstract java.lang.String getValue();
475 abstract class MixInCommonHeader extends MixIn {
476 @JsonProperty("api-ver")
477 abstract java.lang.String getApiVer();
478 @JsonProperty("originator-id")
479 abstract java.lang.String getOriginatorId();
480 @JsonProperty("request-id")
481 abstract java.lang.String getRequestId();
482 @JsonProperty("sub-request-id")
483 abstract java.lang.String getSubRequestId();
486 abstract class MixInFlagsMessage extends MixIn {
487 @JsonProperty("common-header")
488 abstract CommonHeader getCommonHeader();