2 * ============LICENSE_START=======================================================
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
13 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 * ============LICENSE_END=========================================================
24 package org.onap.appc.requesthandler.conv;
26 import com.att.eelf.configuration.EELFLogger;
27 import com.att.eelf.configuration.EELFManager;
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;
51 import java.text.ParseException;
52 import java.text.SimpleDateFormat;
53 import java.util.Date;
54 import java.util.TimeZone;
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);
62 isoFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
65 public static Builder<?> convAsyncResponseToBuilder(VNFOperation vnfOperation, String rpcName, ResponseContext response) {
66 Builder<?> outObj = null;
68 throw new IllegalArgumentException("empty asyncResponse");
70 if(vnfOperation == null){
71 throw new IllegalArgumentException("empty asyncResponse.action");
73 Action action = Action.valueOf(vnfOperation.name());
74 CommonHeader commonHeader = convAsyncResponseTorev160108CommonHeader(response);
75 Status status = convAsyncResponseTorev160108Status(response);
76 Payload payload = convAsyncResponseTorev160108Payload(response);
79 outObj = new RollbackOutputBuilder();
80 ((RollbackOutputBuilder)outObj).setCommonHeader(commonHeader);
81 ((RollbackOutputBuilder)outObj).setStatus(status);
84 outObj = new SnapshotOutputBuilder();
85 ((SnapshotOutputBuilder)outObj).setCommonHeader(commonHeader);
86 ((SnapshotOutputBuilder)outObj).setStatus(status);
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
94 outObj = new AuditOutputBuilder();
95 ((AuditOutputBuilder)outObj).setCommonHeader(commonHeader);
96 ((AuditOutputBuilder)outObj).setStatus(status);
97 ((AuditOutputBuilder)outObj).setPayload(payload);
100 outObj = new HealthCheckOutputBuilder();
101 ((HealthCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
102 ((HealthCheckOutputBuilder)outObj).setStatus(status);
105 outObj = new LiveUpgradeOutputBuilder();
106 ((LiveUpgradeOutputBuilder)outObj).setCommonHeader(commonHeader);
107 ((LiveUpgradeOutputBuilder)outObj).setStatus(status);
110 outObj = new LockOutputBuilder();
111 ((LockOutputBuilder)outObj).setCommonHeader(commonHeader);
112 ((LockOutputBuilder)outObj).setStatus(status);
115 outObj = new ConfigureOutputBuilder();
116 ((ConfigureOutputBuilder)outObj).setCommonHeader(commonHeader);
117 ((ConfigureOutputBuilder)outObj).setStatus(status);
118 ((ConfigureOutputBuilder)outObj).setPayload(payload);
121 outObj = new ConfigModifyOutputBuilder();
122 ((ConfigModifyOutputBuilder)outObj).setCommonHeader(commonHeader);
123 ((ConfigModifyOutputBuilder)outObj).setStatus(status);
124 ((ConfigModifyOutputBuilder)outObj).setPayload(payload);
127 outObj = new ConfigScaleOutOutputBuilder();
128 ((ConfigScaleOutOutputBuilder)outObj).setCommonHeader(commonHeader);
129 ((ConfigScaleOutOutputBuilder)outObj).setStatus(status);
130 ((ConfigScaleOutOutputBuilder)outObj).setPayload(payload);
133 outObj = new ConfigRestoreOutputBuilder();
134 ((ConfigRestoreOutputBuilder)outObj).setCommonHeader(commonHeader);
135 ((ConfigRestoreOutputBuilder)outObj).setStatus(status);
136 ((ConfigRestoreOutputBuilder)outObj).setPayload(payload);
139 outObj = new SoftwareUploadOutputBuilder();
140 ((SoftwareUploadOutputBuilder)outObj).setCommonHeader(commonHeader);
141 ((SoftwareUploadOutputBuilder)outObj).setStatus(status);
144 outObj = new StopOutputBuilder();
145 ((StopOutputBuilder)outObj).setCommonHeader(commonHeader);
146 ((StopOutputBuilder)outObj).setStatus(status);
149 outObj = new SyncOutputBuilder();
150 ((SyncOutputBuilder)outObj).setCommonHeader(commonHeader);
151 ((SyncOutputBuilder)outObj).setStatus(status);
152 ((SyncOutputBuilder)outObj).setPayload(payload);
155 outObj = new TerminateOutputBuilder();
156 ((TerminateOutputBuilder)outObj).setCommonHeader(commonHeader);
157 ((TerminateOutputBuilder)outObj).setStatus(status);
160 outObj = new TestOutputBuilder();
161 ((TestOutputBuilder)outObj).setCommonHeader(commonHeader);
162 ((TestOutputBuilder)outObj).setStatus(status);
165 outObj = new UnlockOutputBuilder();
166 ((UnlockOutputBuilder)outObj).setCommonHeader(commonHeader);
167 ((UnlockOutputBuilder)outObj).setStatus(status);
170 outObj = new RestartOutputBuilder();
171 ((RestartOutputBuilder)outObj).setCommonHeader(commonHeader);
172 ((RestartOutputBuilder)outObj).setStatus(status);
175 outObj = new RebuildOutputBuilder();
176 ((RebuildOutputBuilder)outObj).setCommonHeader(commonHeader);
177 ((RebuildOutputBuilder)outObj).setStatus(status);
180 outObj = new MigrateOutputBuilder();
181 ((MigrateOutputBuilder)outObj).setCommonHeader(commonHeader);
182 ((MigrateOutputBuilder)outObj).setStatus(status);
185 outObj = new EvacuateOutputBuilder();
186 ((EvacuateOutputBuilder)outObj).setCommonHeader(commonHeader);
187 ((EvacuateOutputBuilder)outObj).setStatus(status);
190 outObj = new ConfigBackupOutputBuilder();
191 ((ConfigBackupOutputBuilder)outObj).setCommonHeader(commonHeader);
192 ((ConfigBackupOutputBuilder)outObj).setStatus(status);
193 ((ConfigBackupOutputBuilder)outObj).setPayload(payload);
195 case ConfigBackupDelete:
196 outObj = new ConfigBackupDeleteOutputBuilder();
197 ((ConfigBackupDeleteOutputBuilder)outObj).setCommonHeader(commonHeader);
198 ((ConfigBackupDeleteOutputBuilder)outObj).setStatus(status);
199 ((ConfigBackupDeleteOutputBuilder)outObj).setPayload(payload);
202 outObj = new ConfigExportOutputBuilder();
203 ((ConfigExportOutputBuilder)outObj).setCommonHeader(commonHeader);
204 ((ConfigExportOutputBuilder)outObj).setStatus(status);
207 outObj = new StartOutputBuilder();
208 ((StartOutputBuilder)outObj).setCommonHeader(commonHeader);
209 ((StartOutputBuilder)outObj).setStatus(status);
211 case StopApplication:
212 outObj = new StopApplicationOutputBuilder();
213 ((StopApplicationOutputBuilder)outObj).setCommonHeader(commonHeader);
214 ((StopApplicationOutputBuilder)outObj).setStatus(status);
216 case StartApplication:
217 outObj = new StartApplicationOutputBuilder();
218 ((StartApplicationOutputBuilder)outObj).setCommonHeader(commonHeader);
219 ((StartApplicationOutputBuilder)outObj).setStatus(status);
222 outObj = new QuiesceTrafficOutputBuilder();
223 ((QuiesceTrafficOutputBuilder)outObj).setCommonHeader(commonHeader);
224 ((QuiesceTrafficOutputBuilder)outObj).setStatus(status);
227 outObj = new ResumeTrafficOutputBuilder();
228 ((ResumeTrafficOutputBuilder)outObj).setCommonHeader(commonHeader);
229 ((ResumeTrafficOutputBuilder)outObj).setStatus(status);
231 case UpgradeSoftware:
232 outObj = new UpgradeSoftwareOutputBuilder();
233 ((UpgradeSoftwareOutputBuilder)outObj).setCommonHeader(commonHeader);
234 ((UpgradeSoftwareOutputBuilder)outObj).setStatus(status);
236 case UpgradePostCheck:
237 outObj = new UpgradePostCheckOutputBuilder();
238 ((UpgradePostCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
239 ((UpgradePostCheckOutputBuilder)outObj).setStatus(status);
242 outObj = new UpgradeBackupOutputBuilder();
243 ((UpgradeBackupOutputBuilder)outObj).setCommonHeader(commonHeader);
244 ((UpgradeBackupOutputBuilder)outObj).setStatus(status);
247 outObj = new UpgradeBackoutOutputBuilder();
248 ((UpgradeBackoutOutputBuilder)outObj).setCommonHeader(commonHeader);
249 ((UpgradeBackoutOutputBuilder)outObj).setStatus(status);
251 case UpgradePreCheck:
252 outObj = new UpgradePreCheckOutputBuilder();
253 ((UpgradePreCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
254 ((UpgradePreCheckOutputBuilder)outObj).setStatus(status);
257 outObj = new AttachVolumeOutputBuilder();
258 ((AttachVolumeOutputBuilder)outObj).setCommonHeader(commonHeader);
259 ((AttachVolumeOutputBuilder)outObj).setStatus(status);
262 outObj = new DetachVolumeOutputBuilder();
263 ((DetachVolumeOutputBuilder)outObj).setCommonHeader(commonHeader);
264 ((DetachVolumeOutputBuilder)outObj).setStatus(status);
267 throw new IllegalArgumentException(action+" action is not supported");
271 public static Payload convAsyncResponseTorev160108Payload(ResponseContext inObj) {
272 Payload payload = null;
273 if(inObj.getPayload() != null) {
274 payload = new Payload(inObj.getPayload());
279 public static String convPayloadObjectToJsonString(Object inObj) throws ParseException {
280 String payloadAsString = null;
283 if(inObj instanceof String){
284 payloadAsString = (String)inObj;
287 ObjectMapper objectMapper = new ObjectMapper();
288 payloadAsString = objectMapper.writeValueAsString(inObj);
289 } catch (JsonProcessingException e) {
290 String errMsg = "Error serialize payload json to string";
291 throw new ParseException(errMsg + "-" + e.toString(), 0);
295 return payloadAsString;
298 public static Status convAsyncResponseTorev160108Status(ResponseContext inObj) {
299 StatusBuilder statusBuilder = new StatusBuilder();
300 statusBuilder.setCode(inObj.getStatus().getCode());
301 statusBuilder.setMessage(inObj.getStatus().getMessage());
302 return statusBuilder.build();
305 public static CommonHeader convAsyncResponseTorev160108CommonHeader(ResponseContext inObj) {
306 CommonHeader outObj = null;
308 throw new IllegalArgumentException("empty asyncResponse");
311 CommonHeaderBuilder commonHeaderBuilder = new CommonHeaderBuilder();
312 org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags commonHeaderFlags;
313 if(inObj.getCommonHeader().getFlags() != null){
314 commonHeaderFlags = Converter.convFlagsMapTorev160108Flags(inObj.getCommonHeader().getFlags());
315 commonHeaderBuilder.setFlags(commonHeaderFlags);
319 commonHeaderBuilder.setApiVer(inObj.getCommonHeader().getApiVer());
320 commonHeaderBuilder.setRequestId(inObj.getCommonHeader().getRequestId());
321 if(inObj.getCommonHeader().getSubRequestId() != null){
322 commonHeaderBuilder.setSubRequestId(inObj.getCommonHeader().getSubRequestId());
325 if(inObj.getCommonHeader().getOriginatorId() != null){
326 commonHeaderBuilder.setOriginatorId(inObj.getCommonHeader().getOriginatorId());
329 if(inObj.getCommonHeader().getTimeStamp() != null){
330 String zuluTimestampStr = Converter.convDateToZuluString(inObj.getCommonHeader().getTimeStamp());
331 ZULU zuluTimestamp = new ZULU(zuluTimestampStr);
332 commonHeaderBuilder.setTimestamp(zuluTimestamp);
334 outObj = commonHeaderBuilder.build();
339 public static String convDateToZuluString(Date timeStamp) {
340 return isoFormatter.format(timeStamp);
343 public static org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags
344 convFlagsMapTorev160108Flags(org.onap.appc.domainmodel.lcm.Flags flags) {
345 Flags rev160108flags;
346 boolean anyFlag = false;
347 FlagsBuilder flagsBuilder = new FlagsBuilder();
349 * TODO: The below flags are related to APP-C request and should not be sent back - uncomment when response flags are introduced.
352 if(flags.containsKey(FORCE_FLAG)){
353 org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Force force =
354 org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Force.valueOf(flags.get(FORCE_FLAG).toString());
355 flagsBuilder.setForce(force);
358 if(flags.containsKey(MODE_FLAG)){
359 org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Mode mode =
360 org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Mode.valueOf(flags.get(MODE_FLAG).toString());
361 flagsBuilder.setMode(mode);
364 if(flags.containsKey(TTL_FLAG)){
365 flagsBuilder.setTtl(Integer.valueOf(flags.get(TTL_FLAG).toString()));
369 rev160108flags = flagsBuilder.build();
373 rev160108flags = flagsBuilder.build();
374 return rev160108flags;
377 public static String convAsyncResponseToJsonStringBody(VNFOperation vnfOperation, String rpcName, ResponseContext asyncResponse) throws JsonProcessingException {
378 Builder<?> builder = Converter.convAsyncResponseToBuilder(vnfOperation, rpcName, asyncResponse);
379 Object message = builder.build();
380 ObjectMapper objectMapper = new ObjectMapper();
381 objectMapper.addMixInAnnotations(message.getClass(), MixInFlagsMessage.class);
382 objectMapper.addMixInAnnotations(CommonHeader.class, MixInCommonHeader.class);
383 objectMapper.addMixInAnnotations(Flags.class, MixIn.class);
384 objectMapper.addMixInAnnotations(Status.class, MixIn.class);
385 objectMapper.addMixInAnnotations(Payload.class, MixIn.class);
386 objectMapper.addMixInAnnotations(ZULU.class, MixIn.class);
388 // .configure(SerializationConfig.Feature.SORT_PROPERTIES_ALPHABETICALLY,true)
389 ObjectWriter writer = objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL).configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY,true)
390 .writer(SerializationFeature.WRAP_ROOT_VALUE).withRootName(DMaaP_ROOT_VALUE).withoutFeatures(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS);
391 return writer.writeValueAsString(message);
394 public static String convAsyncResponseToDmaapOutgoingMessageJsonString(VNFOperation vnfOperation, String rpcName, ResponseContext asyncResponse) throws JsonProcessingException {
395 DmaapOutgoingMessage dmaapOutgoingMessage = convAsyncResponseToDmaapOutgoingMessage(vnfOperation, rpcName, asyncResponse);
396 ObjectMapper objectMapper = new ObjectMapper();
397 objectMapper.addMixInAnnotations(dmaapOutgoingMessage.getBody().getOutput().getClass(), MixInFlagsMessage.class);
398 objectMapper.addMixInAnnotations(CommonHeader.class, MixInCommonHeader.class);
399 objectMapper.addMixInAnnotations(Flags.class, MixIn.class);
400 objectMapper.addMixInAnnotations(Status.class, MixIn.class);
401 objectMapper.addMixInAnnotations(Payload.class, MixIn.class);
402 objectMapper.addMixInAnnotations(ZULU.class, MixIn.class);
404 // .configure(SerializationConfig.Feature.SORT_PROPERTIES_ALPHABETICALLY,true)
405 ObjectWriter writer = objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL).configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY,true).writer();
406 return writer.writeValueAsString(dmaapOutgoingMessage);
409 public static DmaapOutgoingMessage convAsyncResponseToDmaapOutgoingMessage(VNFOperation vnfOperation, String rpcName, ResponseContext asyncResponse) throws JsonProcessingException {
410 DmaapOutgoingMessage outObj = new DmaapOutgoingMessage();
411 String correlationID = getCorrelationID(asyncResponse);
412 outObj.setCorrelationID(correlationID);
413 outObj.setType("response");
414 outObj.setRpcName(rpcName);
415 Builder<?> builder = Converter.convAsyncResponseToBuilder(vnfOperation, rpcName, asyncResponse);
416 Object messageBody = builder.build();
417 DmaapOutgoingMessage.Body body = new DmaapOutgoingMessage.Body(messageBody);
418 outObj.setBody(body);
422 private static String getCorrelationID(ResponseContext context) {
423 return context.getCommonHeader().getRequestId()
424 + (context.getCommonHeader().getSubRequestId() == null ?
425 "":"-" + context.getCommonHeader().getSubRequestId());
428 abstract class MixIn {
430 abstract Class<? extends DataContainer> getImplementedInterface(); // to be removed during serialization
433 abstract java.lang.String getValue();
435 abstract class MixInCommonHeader extends MixIn {
436 @JsonProperty("api-ver")
437 abstract java.lang.String getApiVer();
438 @JsonProperty("originator-id")
439 abstract java.lang.String getOriginatorId();
440 @JsonProperty("request-id")
441 abstract java.lang.String getRequestId();
442 @JsonProperty("sub-request-id")
443 abstract java.lang.String getSubRequestId();
446 abstract class MixInFlagsMessage extends MixIn {
447 @JsonProperty("common-header")
448 abstract CommonHeader getCommonHeader();