Improve code coverage for PM File Converter (Go)
[nonrtric/plt/ranpm.git] / pm-file-converter / components / xmltransform / xmltransform.go
1 // -
2 //
3 //      ========================LICENSE_START=================================
4 //      O-RAN-SC
5 //      %%
6 //      Copyright (C) 2023: Nordix Foundation
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
21 package xmltransform
22
23 import (
24         "bytes"
25         "compress/gzip"
26         "encoding/xml"
27         "errors"
28         "fmt"
29         jsoniter "github.com/json-iterator/go"
30         log "github.com/sirupsen/logrus"
31         "io"
32         "main/common/dataTypes"
33         "net/http"
34         "strconv"
35         "time"
36 )
37
38 //lint:ignore S117
39 func xml_to_json_conv(f_byteValue *[]byte, xfeh *dataTypes.XmlFileEventHeader) ([]byte, error) {
40         var f dataTypes.MeasCollecFile
41         start := time.Now()
42         err := xml.Unmarshal(*f_byteValue, &f)
43         if err != nil {
44                 return nil, errors.New("Cannot unmarshal xml-file")
45         }
46         log.Debug("Unmarshal xml file XmlFileEvent: ", time.Since(start).String())
47
48         start = time.Now()
49         var pmfile dataTypes.PMJsonFile
50
51         //TODO: Fill in more values
52         pmfile.Event.Perf3GppFields.Perf3GppFieldsVersion = "1.0"
53         pmfile.Event.Perf3GppFields.MeasDataCollection.GranularityPeriod = 900
54         pmfile.Event.Perf3GppFields.MeasDataCollection.MeasuredEntityUserName = ""
55         pmfile.Event.Perf3GppFields.MeasDataCollection.MeasuredEntityDn = f.FileHeader.FileSender.LocalDn
56         pmfile.Event.Perf3GppFields.MeasDataCollection.MeasuredEntitySoftwareVersion = f.MeasData.ManagedElement.SwVersion
57
58         for _, it := range f.MeasData.MeasInfo {
59                 var mili dataTypes.MeasInfoList
60                 mili.MeasInfoID.SMeasInfoID = it.MeasInfoId
61                 for _, jt := range it.MeasType {
62                         mili.MeasTypes.SMeasTypesList = append(mili.MeasTypes.SMeasTypesList, jt.Text)
63                 }
64                 for _, jt := range it.MeasValue {
65                         var mv dataTypes.MeasValues
66                         mv.MeasObjInstID = jt.MeasObjLdn
67                         mv.SuspectFlag = jt.Suspect
68                         if jt.Suspect == "" {
69                                 mv.SuspectFlag = "false"
70                         }
71                         for _, kt := range jt.R {
72                                 ni, _ := strconv.Atoi(kt.P)
73                                 nv := kt.Text
74                                 mr := dataTypes.MeasResults{ni, nv}
75                                 mv.MeasResultsList = append(mv.MeasResultsList, mr)
76                         }
77                         mili.MeasValuesList = append(mili.MeasValuesList, mv)
78                 }
79
80                 pmfile.Event.Perf3GppFields.MeasDataCollection.SMeasInfoList = append(pmfile.Event.Perf3GppFields.MeasDataCollection.SMeasInfoList, mili)
81         }
82
83         pmfile.Event.Perf3GppFields.MeasDataCollection.GranularityPeriod = 900
84
85         //TODO: Fill more values
86         pmfile.Event.CommonEventHeader.Domain = ""    //xfeh.Domain
87         pmfile.Event.CommonEventHeader.EventID = ""   //xfeh.EventID
88         pmfile.Event.CommonEventHeader.Sequence = 0   //xfeh.Sequence
89         pmfile.Event.CommonEventHeader.EventName = "" //xfeh.EventName
90         pmfile.Event.CommonEventHeader.SourceName = xfeh.SourceName
91         pmfile.Event.CommonEventHeader.ReportingEntityName = "" //xfeh.ReportingEntityName
92         pmfile.Event.CommonEventHeader.Priority = ""            //xfeh.Priority
93         pmfile.Event.CommonEventHeader.StartEpochMicrosec = xfeh.StartEpochMicrosec
94         pmfile.Event.CommonEventHeader.LastEpochMicrosec = xfeh.LastEpochMicrosec
95         pmfile.Event.CommonEventHeader.Version = ""                 //xfeh.Version
96         pmfile.Event.CommonEventHeader.VesEventListenerVersion = "" //xfeh.VesEventListenerVersion
97         pmfile.Event.CommonEventHeader.TimeZoneOffset = xfeh.TimeZoneOffset
98
99         log.Debug("Convert xml to json : ", time.Since(start).String())
100
101         start = time.Now()
102         json, err := jsoniter.Marshal(pmfile)
103         log.Debug("Marshal json : ", time.Since(start).String())
104
105         if err != nil {
106                 return nil, errors.New("Cannot marshal converted json")
107         }
108         return json, nil
109 }
110
111 func Convert(inputS3Url, compression, xmlFileEventHeader string) []byte {
112         evt_data := dataTypes.XmlFileEventHeader{}
113         jsoniter.Unmarshal([]byte(xmlFileEventHeader), &evt_data)
114
115         client := new(http.Client)
116
117         request, err := http.NewRequest("GET", inputS3Url, nil)
118         request.Header.Add("Accept-Encoding", "gzip")
119
120         response, err := client.Do(request)
121         defer response.Body.Close()
122
123         // Check that the server actually sent compressed data
124         var reader io.ReadCloser
125         switch compression {
126         case "gzip", "gz":
127                 reader, err = gzip.NewReader(response.Body)
128                 defer reader.Close()
129         default:
130                 reader = response.Body
131         }
132
133         var buf3 bytes.Buffer
134         _, err2 := io.Copy(&buf3, reader)
135         if err2 != nil {
136                 log.Error("Error reading response, discarding message, ", err)
137                 return nil
138         }
139         file_bytes := buf3.Bytes()
140         fmt.Println("Converting to XML")
141         b, err := xml_to_json_conv(&file_bytes, &evt_data)
142         return b
143 }