/*
 * ============LICENSE_START=======================================================
 * dcaegen2-collectors-veshv
 * ================================================================================
 * Copyright (C) 2018 NOKIA
 * ================================================================================
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ============LICENSE_END=========================================================
 */
syntax = "proto3";
package org.onap.ves;
import "MeasDataCollection.proto";              // for 3GPP PM format

message Perf3gppFields
{
    string perf3gppFieldsVersion = 1;           // required, current value "1.0"
    MeasDataCollection measDataCollection = 2;  // required
    // Based on 3GPP TS 28.550
    // Logical mapping from 3GPP to ONAP header fields:
    // 3GPP MeasFileHeader     ONAP/VES CommonEventHeader
    // senderName              sourceName
    // senderType              nfNamingCode + nfcNamingCode
    // vendorName              nfVendorName
    // collectionBeginTime     startEpochMicrosec
    // timestamp               lastEpochMicrosec
    map<string, string> eventAddlFlds = 3;      // optional per-event data (name/value HashMap)
}
