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 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.eelf.configuration.EELFLogger;
29 import com.att.eelf.configuration.EELFManager;
31 import com.fasterxml.jackson.annotation.JsonIgnore;
32 import com.fasterxml.jackson.annotation.JsonInclude;
33 import com.fasterxml.jackson.annotation.JsonProperty;
34 import com.fasterxml.jackson.annotation.JsonValue;
35 import com.fasterxml.jackson.core.JsonProcessingException;
36 import com.fasterxml.jackson.databind.MapperFeature;
37 import com.fasterxml.jackson.databind.ObjectMapper;
38 import com.fasterxml.jackson.databind.ObjectWriter;
39 import com.fasterxml.jackson.databind.SerializationFeature;
40 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.*;
41 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeader;
42 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeaderBuilder;
43 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags;
44 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.FlagsBuilder;
45 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.Status;
46 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.StatusBuilder;
47 import org.opendaylight.yangtools.concepts.Builder;
48 import org.opendaylight.yangtools.yang.binding.DataContainer;
49 import org.onap.appc.domainmodel.lcm.ResponseContext;
50 import org.onap.appc.domainmodel.lcm.VNFOperation;
51 import org.onap.appc.requesthandler.impl.AbstractRequestHandlerImpl;
52 import org.onap.appc.requesthandler.impl.DmaapOutgoingMessage;
54 import java.text.ParseException;
55 import java.text.SimpleDateFormat;
56 import java.util.Date;
57 import java.util.TimeZone;
60 public class Converter {
61 private static final String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
62 private final static String DMaaP_ROOT_VALUE = "output";
63 private static final SimpleDateFormat isoFormatter = new SimpleDateFormat(ISO_FORMAT);
64 private final static EELFLogger logger = EELFManager.getInstance().getLogger(Converter.class);
66 isoFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
69 public static Builder<?> convAsyncResponseToBuilder(VNFOperation vnfOperation, String rpcName, ResponseContext response) {
70 Builder<?> outObj = null;
72 throw new IllegalArgumentException("empty asyncResponse");
74 if(vnfOperation == null){
75 throw new IllegalArgumentException("empty asyncResponse.action");
77 logger.debug("Entered Converter.convAsyncResponseToBuilder()");
78 Action action = Action.valueOf(vnfOperation.name());
79 CommonHeader commonHeader = convAsyncResponseTorev160108CommonHeader(response);
80 Status status = convAsyncResponseTorev160108Status(response);
81 Payload payload = convAsyncResponseTorev160108Payload(response);
82 logger.debug("Extracted action, status, payload ");
85 outObj = new RollbackOutputBuilder();
86 ((RollbackOutputBuilder)outObj).setCommonHeader(commonHeader);
87 ((RollbackOutputBuilder)outObj).setStatus(status);
90 outObj = new SnapshotOutputBuilder();
91 ((SnapshotOutputBuilder)outObj).setCommonHeader(commonHeader);
92 ((SnapshotOutputBuilder)outObj).setStatus(status);
94 ((SnapshotOutputBuilder) outObj).setSnapshotId(response.getAdditionalContext().get("output.snapshot-id"));
95 } catch (NullPointerException ignored) {
96 // in case of negative response, snapshotID does not populated, so just ignore NPL
100 outObj = new AuditOutputBuilder();
101 ((AuditOutputBuilder)outObj).setCommonHeader(commonHeader);
102 ((AuditOutputBuilder)outObj).setStatus(status);
103 ((AuditOutputBuilder)outObj).setPayload(payload);
106 outObj = new HealthCheckOutputBuilder();
107 ((HealthCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
108 ((HealthCheckOutputBuilder)outObj).setStatus(status);
109 ((HealthCheckOutputBuilder)outObj).setPayload(payload);
110 logger.debug("In HealthCheck case- created outObj, returning");
113 outObj = new LiveUpgradeOutputBuilder();
114 ((LiveUpgradeOutputBuilder)outObj).setCommonHeader(commonHeader);
115 ((LiveUpgradeOutputBuilder)outObj).setStatus(status);
118 outObj = new LockOutputBuilder();
119 ((LockOutputBuilder)outObj).setCommonHeader(commonHeader);
120 ((LockOutputBuilder)outObj).setStatus(status);
123 outObj = new ConfigureOutputBuilder();
124 ((ConfigureOutputBuilder)outObj).setCommonHeader(commonHeader);
125 ((ConfigureOutputBuilder)outObj).setStatus(status);
126 ((ConfigureOutputBuilder)outObj).setPayload(payload);
129 outObj = new ConfigModifyOutputBuilder();
130 ((ConfigModifyOutputBuilder)outObj).setCommonHeader(commonHeader);
131 ((ConfigModifyOutputBuilder)outObj).setStatus(status);
132 ((ConfigModifyOutputBuilder)outObj).setPayload(payload);
135 outObj = new ConfigScaleOutOutputBuilder();
136 ((ConfigScaleOutOutputBuilder)outObj).setCommonHeader(commonHeader);
137 ((ConfigScaleOutOutputBuilder)outObj).setStatus(status);
138 ((ConfigScaleOutOutputBuilder)outObj).setPayload(payload);
141 outObj = new ConfigRestoreOutputBuilder();
142 ((ConfigRestoreOutputBuilder)outObj).setCommonHeader(commonHeader);
143 ((ConfigRestoreOutputBuilder)outObj).setStatus(status);
144 ((ConfigRestoreOutputBuilder)outObj).setPayload(payload);
147 outObj = new SoftwareUploadOutputBuilder();
148 ((SoftwareUploadOutputBuilder)outObj).setCommonHeader(commonHeader);
149 ((SoftwareUploadOutputBuilder)outObj).setStatus(status);
152 outObj = new StopOutputBuilder();
153 ((StopOutputBuilder)outObj).setCommonHeader(commonHeader);
154 ((StopOutputBuilder)outObj).setStatus(status);
157 outObj = new SyncOutputBuilder();
158 ((SyncOutputBuilder)outObj).setCommonHeader(commonHeader);
159 ((SyncOutputBuilder)outObj).setStatus(status);
160 ((SyncOutputBuilder)outObj).setPayload(payload);
163 outObj = new TerminateOutputBuilder();
164 ((TerminateOutputBuilder)outObj).setCommonHeader(commonHeader);
165 ((TerminateOutputBuilder)outObj).setStatus(status);
168 outObj = new TestOutputBuilder();
169 ((TestOutputBuilder)outObj).setCommonHeader(commonHeader);
170 ((TestOutputBuilder)outObj).setStatus(status);
173 outObj = new UnlockOutputBuilder();
174 ((UnlockOutputBuilder)outObj).setCommonHeader(commonHeader);
175 ((UnlockOutputBuilder)outObj).setStatus(status);
178 outObj = new RestartOutputBuilder();
179 ((RestartOutputBuilder)outObj).setCommonHeader(commonHeader);
180 ((RestartOutputBuilder)outObj).setStatus(status);
183 outObj = new RebuildOutputBuilder();
184 ((RebuildOutputBuilder)outObj).setCommonHeader(commonHeader);
185 ((RebuildOutputBuilder)outObj).setStatus(status);
188 outObj = new RebootOutputBuilder();
189 ((RebootOutputBuilder)outObj).setCommonHeader(commonHeader);
190 ((RebootOutputBuilder)outObj).setStatus(status);
193 outObj = new MigrateOutputBuilder();
194 ((MigrateOutputBuilder)outObj).setCommonHeader(commonHeader);
195 ((MigrateOutputBuilder)outObj).setStatus(status);
198 outObj = new EvacuateOutputBuilder();
199 ((EvacuateOutputBuilder)outObj).setCommonHeader(commonHeader);
200 ((EvacuateOutputBuilder)outObj).setStatus(status);
203 outObj = new ConfigBackupOutputBuilder();
204 ((ConfigBackupOutputBuilder)outObj).setCommonHeader(commonHeader);
205 ((ConfigBackupOutputBuilder)outObj).setStatus(status);
206 ((ConfigBackupOutputBuilder)outObj).setPayload(payload);
208 case ConfigBackupDelete:
209 outObj = new ConfigBackupDeleteOutputBuilder();
210 ((ConfigBackupDeleteOutputBuilder)outObj).setCommonHeader(commonHeader);
211 ((ConfigBackupDeleteOutputBuilder)outObj).setStatus(status);
212 ((ConfigBackupDeleteOutputBuilder)outObj).setPayload(payload);
215 outObj = new ConfigExportOutputBuilder();
216 ((ConfigExportOutputBuilder)outObj).setCommonHeader(commonHeader);
217 ((ConfigExportOutputBuilder)outObj).setStatus(status);
220 outObj = new StartOutputBuilder();
221 ((StartOutputBuilder)outObj).setCommonHeader(commonHeader);
222 ((StartOutputBuilder)outObj).setStatus(status);
224 case StopApplication:
225 outObj = new StopApplicationOutputBuilder();
226 ((StopApplicationOutputBuilder)outObj).setCommonHeader(commonHeader);
227 ((StopApplicationOutputBuilder)outObj).setStatus(status);
229 case StartApplication:
230 outObj = new StartApplicationOutputBuilder();
231 ((StartApplicationOutputBuilder)outObj).setCommonHeader(commonHeader);
232 ((StartApplicationOutputBuilder)outObj).setStatus(status);
235 outObj = new QuiesceTrafficOutputBuilder();
236 ((QuiesceTrafficOutputBuilder)outObj).setCommonHeader(commonHeader);
237 ((QuiesceTrafficOutputBuilder)outObj).setStatus(status);
240 outObj = new ResumeTrafficOutputBuilder();
241 ((ResumeTrafficOutputBuilder)outObj).setCommonHeader(commonHeader);
242 ((ResumeTrafficOutputBuilder)outObj).setStatus(status);
244 case UpgradeSoftware:
245 outObj = new UpgradeSoftwareOutputBuilder();
246 ((UpgradeSoftwareOutputBuilder)outObj).setCommonHeader(commonHeader);
247 ((UpgradeSoftwareOutputBuilder)outObj).setStatus(status);
249 case UpgradePostCheck:
250 outObj = new UpgradePostCheckOutputBuilder();
251 ((UpgradePostCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
252 ((UpgradePostCheckOutputBuilder)outObj).setStatus(status);
253 ((UpgradePostCheckOutputBuilder)outObj).setPayload(payload);
256 outObj = new UpgradeBackupOutputBuilder();
257 ((UpgradeBackupOutputBuilder)outObj).setCommonHeader(commonHeader);
258 ((UpgradeBackupOutputBuilder)outObj).setStatus(status);
261 outObj = new UpgradeBackoutOutputBuilder();
262 ((UpgradeBackoutOutputBuilder)outObj).setCommonHeader(commonHeader);
263 ((UpgradeBackoutOutputBuilder)outObj).setStatus(status);
265 case UpgradePreCheck:
266 outObj = new UpgradePreCheckOutputBuilder();
267 ((UpgradePreCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
268 ((UpgradePreCheckOutputBuilder)outObj).setStatus(status);
269 ((UpgradePreCheckOutputBuilder)outObj).setPayload(payload);
272 outObj = new AttachVolumeOutputBuilder();
273 ((AttachVolumeOutputBuilder)outObj).setCommonHeader(commonHeader);
274 ((AttachVolumeOutputBuilder)outObj).setStatus(status);
277 outObj = new DetachVolumeOutputBuilder();
278 ((DetachVolumeOutputBuilder)outObj).setCommonHeader(commonHeader);
279 ((DetachVolumeOutputBuilder)outObj).setStatus(status);
281 case DistributeTraffic:
282 outObj = new DistributeTrafficOutputBuilder();
283 ((DistributeTrafficOutputBuilder)outObj).setCommonHeader(commonHeader);
284 ((DistributeTrafficOutputBuilder)outObj).setStatus(status);
287 throw new IllegalArgumentException(action+" action is not supported");
291 public static Payload convAsyncResponseTorev160108Payload(ResponseContext inObj) {
292 Payload payload = null;
293 if(inObj.getPayload() != null) {
294 payload = new Payload(inObj.getPayload());
299 public static String convPayloadObjectToJsonString(Object inObj) throws ParseException {
300 String payloadAsString = null;
303 if(inObj instanceof String){
304 payloadAsString = (String)inObj;
307 ObjectMapper objectMapper = new ObjectMapper();
308 payloadAsString = objectMapper.writeValueAsString(inObj);
309 } catch (JsonProcessingException e) {
310 String errMsg = "Error serialize payload json to string";
311 throw new ParseException(errMsg + "-" + e.toString(), 0);
315 return payloadAsString;
318 public static Status convAsyncResponseTorev160108Status(ResponseContext inObj) {
319 StatusBuilder statusBuilder = new StatusBuilder();
320 statusBuilder.setCode(inObj.getStatus().getCode());
321 statusBuilder.setMessage(inObj.getStatus().getMessage());
322 return statusBuilder.build();
325 public static CommonHeader convAsyncResponseTorev160108CommonHeader(ResponseContext inObj) {
326 CommonHeader outObj = null;
328 throw new IllegalArgumentException("empty asyncResponse");
331 CommonHeaderBuilder commonHeaderBuilder = new CommonHeaderBuilder();
332 org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags commonHeaderFlags;
333 if(inObj.getCommonHeader().getFlags() != null){
334 commonHeaderFlags = Converter.convFlagsMapTorev160108Flags(inObj.getCommonHeader().getFlags());
335 commonHeaderBuilder.setFlags(commonHeaderFlags);
339 commonHeaderBuilder.setApiVer(inObj.getCommonHeader().getApiVer());
340 commonHeaderBuilder.setRequestId(inObj.getCommonHeader().getRequestId());
341 if(inObj.getCommonHeader().getSubRequestId() != null){
342 commonHeaderBuilder.setSubRequestId(inObj.getCommonHeader().getSubRequestId());
345 if(inObj.getCommonHeader().getOriginatorId() != null){
346 commonHeaderBuilder.setOriginatorId(inObj.getCommonHeader().getOriginatorId());
349 if(inObj.getCommonHeader().getTimeStamp() != null){
350 String zuluTimestampStr = Converter.convDateToZuluString(inObj.getCommonHeader().getTimeStamp());
351 ZULU zuluTimestamp = new ZULU(zuluTimestampStr);
352 commonHeaderBuilder.setTimestamp(zuluTimestamp);
354 outObj = commonHeaderBuilder.build();
359 public static String convDateToZuluString(Date timeStamp) {
360 return isoFormatter.format(timeStamp);
363 public static org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags
364 convFlagsMapTorev160108Flags(org.onap.appc.domainmodel.lcm.Flags flags) {
365 Flags rev160108flags;
366 boolean anyFlag = false;
367 FlagsBuilder flagsBuilder = new FlagsBuilder();
369 * TODO: The below flags are related to APP-C request and should not be sent back - uncomment when response flags are introduced.
372 if(flags.containsKey(FORCE_FLAG)){
373 org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Force force =
374 org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Force.valueOf(flags.get(FORCE_FLAG).toString());
375 flagsBuilder.setForce(force);
378 if(flags.containsKey(MODE_FLAG)){
379 org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Mode mode =
380 org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Mode.valueOf(flags.get(MODE_FLAG).toString());
381 flagsBuilder.setMode(mode);
384 if(flags.containsKey(TTL_FLAG)){
385 flagsBuilder.setTtl(Integer.valueOf(flags.get(TTL_FLAG).toString()));
389 rev160108flags = flagsBuilder.build();
393 rev160108flags = flagsBuilder.build();
394 return rev160108flags;
397 public static String convAsyncResponseToJsonStringBody(VNFOperation vnfOperation, String rpcName, ResponseContext asyncResponse) throws JsonProcessingException {
398 Builder<?> builder = Converter.convAsyncResponseToBuilder(vnfOperation, rpcName, asyncResponse);
399 Object message = builder.build();
400 ObjectMapper objectMapper = new ObjectMapper();
401 objectMapper.addMixInAnnotations(message.getClass(), MixInFlagsMessage.class);
402 objectMapper.addMixInAnnotations(CommonHeader.class, MixInCommonHeader.class);
403 objectMapper.addMixInAnnotations(Flags.class, MixIn.class);
404 objectMapper.addMixInAnnotations(Status.class, MixIn.class);
405 objectMapper.addMixInAnnotations(Payload.class, MixIn.class);
406 objectMapper.addMixInAnnotations(ZULU.class, MixIn.class);
408 // .configure(SerializationConfig.Feature.SORT_PROPERTIES_ALPHABETICALLY,true)
409 ObjectWriter writer = objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL).configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY,true)
410 .writer(SerializationFeature.WRAP_ROOT_VALUE).withRootName(DMaaP_ROOT_VALUE).withoutFeatures(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS);
411 return writer.writeValueAsString(message);
414 public static String convAsyncResponseToDmaapOutgoingMessageJsonString(VNFOperation vnfOperation, String rpcName, ResponseContext asyncResponse) throws JsonProcessingException {
415 logger.debug("Entered Converter.convAsyncResponseToDmaapOutgoingMessageJsonString()");
416 DmaapOutgoingMessage dmaapOutgoingMessage = convAsyncResponseToDmaapOutgoingMessage(vnfOperation, rpcName, asyncResponse);
417 ObjectMapper objectMapper = new ObjectMapper();
418 objectMapper.addMixInAnnotations(dmaapOutgoingMessage.getBody().getOutput().getClass(), MixInFlagsMessage.class);
419 objectMapper.addMixInAnnotations(CommonHeader.class, MixInCommonHeader.class);
420 objectMapper.addMixInAnnotations(Flags.class, MixIn.class);
421 objectMapper.addMixInAnnotations(Status.class, MixIn.class);
422 objectMapper.addMixInAnnotations(Payload.class, MixIn.class);
423 objectMapper.addMixInAnnotations(ZULU.class, MixIn.class);
425 // .configure(SerializationConfig.Feature.SORT_PROPERTIES_ALPHABETICALLY,true)
426 ObjectWriter writer = objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL).configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY,true).writer();
427 logger.debug("Exiting Converter.convAsyncResponseToDmaapOutgoingMessageJsonString()");
428 return writer.writeValueAsString(dmaapOutgoingMessage);
431 public static DmaapOutgoingMessage convAsyncResponseToDmaapOutgoingMessage(VNFOperation vnfOperation, String rpcName, ResponseContext asyncResponse) throws JsonProcessingException {
432 logger.debug("Entered Converter.convAsyncResponseToDmaapOutgoingMessage()");
433 DmaapOutgoingMessage outObj = new DmaapOutgoingMessage();
434 String correlationID = getCorrelationID(asyncResponse);
435 outObj.setCorrelationID(correlationID);
436 outObj.setType("response");
437 outObj.setRpcName(rpcName);
438 Builder<?> builder = Converter.convAsyncResponseToBuilder(vnfOperation, rpcName, asyncResponse);
439 Object messageBody = builder.build();
440 DmaapOutgoingMessage.Body body = new DmaapOutgoingMessage.Body(messageBody);
441 outObj.setBody(body);
442 logger.debug("Exiting Converter.convAsyncResponseToDmaapOutgoingMessage():messageBody is :::"+body.toString());
446 private static String getCorrelationID(ResponseContext context) {
447 return context.getCommonHeader().getRequestId()
448 + (context.getCommonHeader().getSubRequestId() == null ?
449 "":"-" + context.getCommonHeader().getSubRequestId());
452 abstract class MixIn {
454 abstract Class<? extends DataContainer> getImplementedInterface(); // to be removed during serialization
457 abstract java.lang.String getValue();
459 abstract class MixInCommonHeader extends MixIn {
460 @JsonProperty("api-ver")
461 abstract java.lang.String getApiVer();
462 @JsonProperty("originator-id")
463 abstract java.lang.String getOriginatorId();
464 @JsonProperty("request-id")
465 abstract java.lang.String getRequestId();
466 @JsonProperty("sub-request-id")
467 abstract java.lang.String getSubRequestId();
470 abstract class MixInFlagsMessage extends MixIn {
471 @JsonProperty("common-header")
472 abstract CommonHeader getCommonHeader();