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 * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22 * ============LICENSE_END=========================================================
25 package org.onap.appc.requesthandler.conv;
27 import com.att.eelf.configuration.EELFLogger;
28 import com.att.eelf.configuration.EELFManager;
30 import com.fasterxml.jackson.annotation.JsonIgnore;
31 import com.fasterxml.jackson.annotation.JsonInclude;
32 import com.fasterxml.jackson.annotation.JsonProperty;
33 import com.fasterxml.jackson.annotation.JsonValue;
34 import com.fasterxml.jackson.core.JsonProcessingException;
35 import com.fasterxml.jackson.databind.MapperFeature;
36 import com.fasterxml.jackson.databind.ObjectMapper;
37 import com.fasterxml.jackson.databind.ObjectWriter;
38 import com.fasterxml.jackson.databind.SerializationFeature;
39 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.*;
40 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeader;
41 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.CommonHeaderBuilder;
42 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags;
43 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.FlagsBuilder;
44 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.Status;
45 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.StatusBuilder;
46 import org.opendaylight.yangtools.concepts.Builder;
47 import org.opendaylight.yangtools.yang.binding.DataContainer;
48 import org.onap.appc.domainmodel.lcm.ResponseContext;
49 import org.onap.appc.domainmodel.lcm.VNFOperation;
50 import org.onap.appc.requesthandler.impl.DmaapOutgoingMessage;
52 import java.text.ParseException;
53 import java.text.SimpleDateFormat;
54 import java.util.Date;
55 import java.util.TimeZone;
58 public class Converter {
59 private static final String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
60 private final static String DMaaP_ROOT_VALUE = "output";
61 private static final SimpleDateFormat isoFormatter = new SimpleDateFormat(ISO_FORMAT);
63 isoFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
66 public static Builder<?> convAsyncResponseToBuilder(VNFOperation vnfOperation, String rpcName, ResponseContext response) {
67 Builder<?> outObj = null;
69 throw new IllegalArgumentException("empty asyncResponse");
71 if(vnfOperation == null){
72 throw new IllegalArgumentException("empty asyncResponse.action");
74 Action action = Action.valueOf(vnfOperation.name());
75 CommonHeader commonHeader = convAsyncResponseTorev160108CommonHeader(response);
76 Status status = convAsyncResponseTorev160108Status(response);
77 Payload payload = convAsyncResponseTorev160108Payload(response);
80 outObj = new RollbackOutputBuilder();
81 ((RollbackOutputBuilder)outObj).setCommonHeader(commonHeader);
82 ((RollbackOutputBuilder)outObj).setStatus(status);
85 outObj = new SnapshotOutputBuilder();
86 ((SnapshotOutputBuilder)outObj).setCommonHeader(commonHeader);
87 ((SnapshotOutputBuilder)outObj).setStatus(status);
89 ((SnapshotOutputBuilder) outObj).setSnapshotId(response.getAdditionalContext().get("output.snapshot-id"));
90 } catch (NullPointerException ignored) {
91 // in case of negative response, snapshotID does not populated, so just ignore NPL
95 outObj = new AuditOutputBuilder();
96 ((AuditOutputBuilder)outObj).setCommonHeader(commonHeader);
97 ((AuditOutputBuilder)outObj).setStatus(status);
98 ((AuditOutputBuilder)outObj).setPayload(payload);
101 outObj = new HealthCheckOutputBuilder();
102 ((HealthCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
103 ((HealthCheckOutputBuilder)outObj).setStatus(status);
106 outObj = new LiveUpgradeOutputBuilder();
107 ((LiveUpgradeOutputBuilder)outObj).setCommonHeader(commonHeader);
108 ((LiveUpgradeOutputBuilder)outObj).setStatus(status);
111 outObj = new LockOutputBuilder();
112 ((LockOutputBuilder)outObj).setCommonHeader(commonHeader);
113 ((LockOutputBuilder)outObj).setStatus(status);
116 outObj = new ConfigureOutputBuilder();
117 ((ConfigureOutputBuilder)outObj).setCommonHeader(commonHeader);
118 ((ConfigureOutputBuilder)outObj).setStatus(status);
119 ((ConfigureOutputBuilder)outObj).setPayload(payload);
122 outObj = new ConfigModifyOutputBuilder();
123 ((ConfigModifyOutputBuilder)outObj).setCommonHeader(commonHeader);
124 ((ConfigModifyOutputBuilder)outObj).setStatus(status);
125 ((ConfigModifyOutputBuilder)outObj).setPayload(payload);
128 outObj = new ConfigScaleOutOutputBuilder();
129 ((ConfigScaleOutOutputBuilder)outObj).setCommonHeader(commonHeader);
130 ((ConfigScaleOutOutputBuilder)outObj).setStatus(status);
131 ((ConfigScaleOutOutputBuilder)outObj).setPayload(payload);
134 outObj = new ConfigRestoreOutputBuilder();
135 ((ConfigRestoreOutputBuilder)outObj).setCommonHeader(commonHeader);
136 ((ConfigRestoreOutputBuilder)outObj).setStatus(status);
137 ((ConfigRestoreOutputBuilder)outObj).setPayload(payload);
140 outObj = new SoftwareUploadOutputBuilder();
141 ((SoftwareUploadOutputBuilder)outObj).setCommonHeader(commonHeader);
142 ((SoftwareUploadOutputBuilder)outObj).setStatus(status);
145 outObj = new StopOutputBuilder();
146 ((StopOutputBuilder)outObj).setCommonHeader(commonHeader);
147 ((StopOutputBuilder)outObj).setStatus(status);
150 outObj = new SyncOutputBuilder();
151 ((SyncOutputBuilder)outObj).setCommonHeader(commonHeader);
152 ((SyncOutputBuilder)outObj).setStatus(status);
153 ((SyncOutputBuilder)outObj).setPayload(payload);
156 outObj = new TerminateOutputBuilder();
157 ((TerminateOutputBuilder)outObj).setCommonHeader(commonHeader);
158 ((TerminateOutputBuilder)outObj).setStatus(status);
161 outObj = new TestOutputBuilder();
162 ((TestOutputBuilder)outObj).setCommonHeader(commonHeader);
163 ((TestOutputBuilder)outObj).setStatus(status);
166 outObj = new UnlockOutputBuilder();
167 ((UnlockOutputBuilder)outObj).setCommonHeader(commonHeader);
168 ((UnlockOutputBuilder)outObj).setStatus(status);
171 outObj = new RestartOutputBuilder();
172 ((RestartOutputBuilder)outObj).setCommonHeader(commonHeader);
173 ((RestartOutputBuilder)outObj).setStatus(status);
176 outObj = new RebuildOutputBuilder();
177 ((RebuildOutputBuilder)outObj).setCommonHeader(commonHeader);
178 ((RebuildOutputBuilder)outObj).setStatus(status);
181 outObj = new MigrateOutputBuilder();
182 ((MigrateOutputBuilder)outObj).setCommonHeader(commonHeader);
183 ((MigrateOutputBuilder)outObj).setStatus(status);
186 outObj = new EvacuateOutputBuilder();
187 ((EvacuateOutputBuilder)outObj).setCommonHeader(commonHeader);
188 ((EvacuateOutputBuilder)outObj).setStatus(status);
191 outObj = new ConfigBackupOutputBuilder();
192 ((ConfigBackupOutputBuilder)outObj).setCommonHeader(commonHeader);
193 ((ConfigBackupOutputBuilder)outObj).setStatus(status);
194 ((ConfigBackupOutputBuilder)outObj).setPayload(payload);
196 case ConfigBackupDelete:
197 outObj = new ConfigBackupDeleteOutputBuilder();
198 ((ConfigBackupDeleteOutputBuilder)outObj).setCommonHeader(commonHeader);
199 ((ConfigBackupDeleteOutputBuilder)outObj).setStatus(status);
200 ((ConfigBackupDeleteOutputBuilder)outObj).setPayload(payload);
203 outObj = new ConfigExportOutputBuilder();
204 ((ConfigExportOutputBuilder)outObj).setCommonHeader(commonHeader);
205 ((ConfigExportOutputBuilder)outObj).setStatus(status);
208 outObj = new StartOutputBuilder();
209 ((StartOutputBuilder)outObj).setCommonHeader(commonHeader);
210 ((StartOutputBuilder)outObj).setStatus(status);
212 case StopApplication:
213 outObj = new StopApplicationOutputBuilder();
214 ((StopApplicationOutputBuilder)outObj).setCommonHeader(commonHeader);
215 ((StopApplicationOutputBuilder)outObj).setStatus(status);
217 case StartApplication:
218 outObj = new StartApplicationOutputBuilder();
219 ((StartApplicationOutputBuilder)outObj).setCommonHeader(commonHeader);
220 ((StartApplicationOutputBuilder)outObj).setStatus(status);
223 outObj = new QuiesceTrafficOutputBuilder();
224 ((QuiesceTrafficOutputBuilder)outObj).setCommonHeader(commonHeader);
225 ((QuiesceTrafficOutputBuilder)outObj).setStatus(status);
228 outObj = new ResumeTrafficOutputBuilder();
229 ((ResumeTrafficOutputBuilder)outObj).setCommonHeader(commonHeader);
230 ((ResumeTrafficOutputBuilder)outObj).setStatus(status);
232 case UpgradeSoftware:
233 outObj = new UpgradeSoftwareOutputBuilder();
234 ((UpgradeSoftwareOutputBuilder)outObj).setCommonHeader(commonHeader);
235 ((UpgradeSoftwareOutputBuilder)outObj).setStatus(status);
237 case UpgradePostCheck:
238 outObj = new UpgradePostCheckOutputBuilder();
239 ((UpgradePostCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
240 ((UpgradePostCheckOutputBuilder)outObj).setStatus(status);
243 outObj = new UpgradeBackupOutputBuilder();
244 ((UpgradeBackupOutputBuilder)outObj).setCommonHeader(commonHeader);
245 ((UpgradeBackupOutputBuilder)outObj).setStatus(status);
248 outObj = new UpgradeBackoutOutputBuilder();
249 ((UpgradeBackoutOutputBuilder)outObj).setCommonHeader(commonHeader);
250 ((UpgradeBackoutOutputBuilder)outObj).setStatus(status);
252 case UpgradePreCheck:
253 outObj = new UpgradePreCheckOutputBuilder();
254 ((UpgradePreCheckOutputBuilder)outObj).setCommonHeader(commonHeader);
255 ((UpgradePreCheckOutputBuilder)outObj).setStatus(status);
258 throw new IllegalArgumentException(action+" action is not supported");
262 public static Payload convAsyncResponseTorev160108Payload(ResponseContext inObj) {
263 Payload payload = null;
264 if(inObj.getPayload() != null) {
265 payload = new Payload(inObj.getPayload());
270 public static String convPayloadObjectToJsonString(Object inObj) throws ParseException {
271 String payloadAsString = null;
274 if(inObj instanceof String){
275 payloadAsString = (String)inObj;
278 ObjectMapper objectMapper = new ObjectMapper();
279 payloadAsString = objectMapper.writeValueAsString(inObj);
280 } catch (JsonProcessingException e) {
281 String errMsg = "Error serialize payload json to string";
282 throw new ParseException(errMsg + "-" + e.toString(), 0);
286 return payloadAsString;
289 public static Status convAsyncResponseTorev160108Status(ResponseContext inObj) {
290 StatusBuilder statusBuilder = new StatusBuilder();
291 statusBuilder.setCode(inObj.getStatus().getCode());
292 statusBuilder.setMessage(inObj.getStatus().getMessage());
293 return statusBuilder.build();
296 public static CommonHeader convAsyncResponseTorev160108CommonHeader(ResponseContext inObj) {
297 CommonHeader outObj = null;
299 throw new IllegalArgumentException("empty asyncResponse");
302 CommonHeaderBuilder commonHeaderBuilder = new CommonHeaderBuilder();
303 org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags commonHeaderFlags;
304 if(inObj.getCommonHeader().getFlags() != null){
305 commonHeaderFlags = Converter.convFlagsMapTorev160108Flags(inObj.getCommonHeader().getFlags());
306 commonHeaderBuilder.setFlags(commonHeaderFlags);
310 commonHeaderBuilder.setApiVer(inObj.getCommonHeader().getApiVer());
311 commonHeaderBuilder.setRequestId(inObj.getCommonHeader().getRequestId());
312 if(inObj.getCommonHeader().getSubRequestId() != null){
313 commonHeaderBuilder.setSubRequestId(inObj.getCommonHeader().getSubRequestId());
316 if(inObj.getCommonHeader().getOriginatorId() != null){
317 commonHeaderBuilder.setOriginatorId(inObj.getCommonHeader().getOriginatorId());
320 if(inObj.getCommonHeader().getTimeStamp() != null){
321 String zuluTimestampStr = Converter.convDateToZuluString(inObj.getCommonHeader().getTimeStamp());
322 ZULU zuluTimestamp = new ZULU(zuluTimestampStr);
323 commonHeaderBuilder.setTimestamp(zuluTimestamp);
325 outObj = commonHeaderBuilder.build();
330 public static String convDateToZuluString(Date timeStamp) {
331 return isoFormatter.format(timeStamp);
334 public static org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags
335 convFlagsMapTorev160108Flags(org.onap.appc.domainmodel.lcm.Flags flags) {
336 Flags rev160108flags;
337 boolean anyFlag = false;
338 FlagsBuilder flagsBuilder = new FlagsBuilder();
340 * TODO: The below flags are related to APP-C request and should not be sent back - uncomment when response flags are introduced.
343 if(flags.containsKey(FORCE_FLAG)){
344 org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Force force =
345 org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Force.valueOf(flags.get(FORCE_FLAG).toString());
346 flagsBuilder.setForce(force);
349 if(flags.containsKey(MODE_FLAG)){
350 org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Mode mode =
351 org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.common.header.common.header.Flags.Mode.valueOf(flags.get(MODE_FLAG).toString());
352 flagsBuilder.setMode(mode);
355 if(flags.containsKey(TTL_FLAG)){
356 flagsBuilder.setTtl(Integer.valueOf(flags.get(TTL_FLAG).toString()));
360 rev160108flags = flagsBuilder.build();
364 rev160108flags = flagsBuilder.build();
365 return rev160108flags;
368 public static String convAsyncResponseToJsonStringBody(VNFOperation vnfOperation, String rpcName, ResponseContext asyncResponse) throws JsonProcessingException {
369 Builder<?> builder = Converter.convAsyncResponseToBuilder(vnfOperation, rpcName, asyncResponse);
370 Object message = builder.build();
371 ObjectMapper objectMapper = new ObjectMapper();
372 objectMapper.addMixInAnnotations(message.getClass(), MixInFlagsMessage.class);
373 objectMapper.addMixInAnnotations(CommonHeader.class, MixInCommonHeader.class);
374 objectMapper.addMixInAnnotations(Flags.class, MixIn.class);
375 objectMapper.addMixInAnnotations(Status.class, MixIn.class);
376 objectMapper.addMixInAnnotations(Payload.class, MixIn.class);
377 objectMapper.addMixInAnnotations(ZULU.class, MixIn.class);
379 // .configure(SerializationConfig.Feature.SORT_PROPERTIES_ALPHABETICALLY,true)
380 ObjectWriter writer = objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL).configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY,true)
381 .writer(SerializationFeature.WRAP_ROOT_VALUE).withRootName(DMaaP_ROOT_VALUE).withoutFeatures(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS);
382 return writer.writeValueAsString(message);
385 public static String convAsyncResponseToDmaapOutgoingMessageJsonString(VNFOperation vnfOperation, String rpcName, ResponseContext asyncResponse) throws JsonProcessingException {
386 DmaapOutgoingMessage dmaapOutgoingMessage = convAsyncResponseToDmaapOutgoingMessage(vnfOperation, rpcName, asyncResponse);
387 ObjectMapper objectMapper = new ObjectMapper();
388 objectMapper.addMixInAnnotations(dmaapOutgoingMessage.getBody().getOutput().getClass(), MixInFlagsMessage.class);
389 objectMapper.addMixInAnnotations(CommonHeader.class, MixInCommonHeader.class);
390 objectMapper.addMixInAnnotations(Flags.class, MixIn.class);
391 objectMapper.addMixInAnnotations(Status.class, MixIn.class);
392 objectMapper.addMixInAnnotations(Payload.class, MixIn.class);
393 objectMapper.addMixInAnnotations(ZULU.class, MixIn.class);
395 // .configure(SerializationConfig.Feature.SORT_PROPERTIES_ALPHABETICALLY,true)
396 ObjectWriter writer = objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL).configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY,true).writer();
397 return writer.writeValueAsString(dmaapOutgoingMessage);
400 public static DmaapOutgoingMessage convAsyncResponseToDmaapOutgoingMessage(VNFOperation vnfOperation, String rpcName, ResponseContext asyncResponse) throws JsonProcessingException {
401 DmaapOutgoingMessage outObj = new DmaapOutgoingMessage();
402 String correlationID = getCorrelationID(asyncResponse);
403 outObj.setCorrelationID(correlationID);
404 outObj.setType("response");
405 outObj.setRpcName(rpcName);
406 Builder<?> builder = Converter.convAsyncResponseToBuilder(vnfOperation, rpcName, asyncResponse);
407 Object messageBody = builder.build();
408 DmaapOutgoingMessage.Body body = new DmaapOutgoingMessage.Body(messageBody);
409 outObj.setBody(body);
413 private static String getCorrelationID(ResponseContext context) {
414 return context.getCommonHeader().getRequestId()
415 + (context.getCommonHeader().getSubRequestId() == null ?
416 "":"-" + context.getCommonHeader().getSubRequestId());
419 abstract class MixIn {
421 abstract Class<? extends DataContainer> getImplementedInterface(); // to be removed during serialization
424 abstract java.lang.String getValue();
426 abstract class MixInCommonHeader extends MixIn {
427 @JsonProperty("api-ver")
428 abstract java.lang.String getApiVer();
429 @JsonProperty("originator-id")
430 abstract java.lang.String getOriginatorId();
431 @JsonProperty("request-id")
432 abstract java.lang.String getRequestId();
433 @JsonProperty("sub-request-id")
434 abstract java.lang.String getSubRequestId();
437 abstract class MixInFlagsMessage extends MixIn {
438 @JsonProperty("common-header")
439 abstract CommonHeader getCommonHeader();