// Copyright 2018-2024 Open Networking Foundation (ONF) and the ONF Contributors
//
// 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) {
    }
}
