// Copyright (c) 2018 Open Networking Foundation
//
// 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.

syntax = "proto3";

option go_package = "github.com/opencord/bbsim/api/bbsim";

package bbsim;


message DmiEvent {
   string event_name= 1;
}

message DmiResponse {
    int32 status_code = 1;
    string message = 2;
}

message DmiEmpty {
}

message TransceiverRequest {
    uint32 TransceiverId = 1;
}

message Transceiver{
    uint32 ID = 1;
    string UUID = 2;
    string Name = 3;
    string Technology = 4;
    bool PluggedIn = 5;
    repeated uint32 PonIds = 6;
}

message Transceivers{
    repeated Transceiver Items = 1;
}


service BBsim_dmi {
    // Ask the DMI Server to create an event
    rpc CreateEvent (DmiEvent) returns (DmiResponse){
    }

    rpc GetTransceivers (DmiEmpty) returns (Transceivers) {
    }

    // Plug out the transceiver by transceiverId
    rpc PlugOutTransceiver (TransceiverRequest) returns (DmiResponse) {
    }
    // Plug in the transceiver of a PON by pon-port-ID
    rpc PlugInTransceiver (TransceiverRequest) returns (DmiResponse) {
    }
}
