//Copyright 2017 the original author or authors.
//
//  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";
package api;
import "google/api/annotations.proto";

message EchoMessage{
   string Ping =1;
}
message EchoReplyMessage{
   string Pong =1;
}

message AddChassisMessage{
   string CLLI =1;
   string XOSIP =2;
   int32 XOSPort=3;
   string XOSUser=4;
   string XOSPassword=5;
   int32 Rack=6;
   int32 Shelf=7;
}
message AddChassisReturn{
   string DeviceID = 1;
}
message ChangeXOSUserPasswordMessage{
   string CLLI =1;
   string XOSUser=2;
   string XOSPassword=3;
}
message ChangeXOSUserPasswordReturn{
   bool Success=1;
}

message AddOLTChassisMessage{
   string CLLI=1;
   string SlotIP=2;
   fixed32 SlotPort=3;
   string Hostname=4;
   fixed32 NumPorts = 5;
   bool Activate = 6;
   enum OltDriver {
      openolt= 0;
      asfvolt16=1;
      adtran=2;
      tibits=3;
   }
   OltDriver Driver=7;
   enum OltType{
      edgecore=0;
      adtranOlt=1;
      tibit=2;
   }
   OltType Type=8;

}
message AddOLTChassisReturn {
   string DeviceID =1;
   string ChassisDeviceID =2;
}

message AddOntMessage{
   string CLLI=1;
   int32 SlotNumber=2;
   int32 PortNumber=3;
   int32 OntNumber=4;
   string SerialNumber=5;
}
message PreProvisionOntMessage{
   string CLLI=1;
   int32 SlotNumber=2;
   int32 PortNumber=3;
   int32 OntNumber=4;
   uint32 STag=5;
   uint32 CTag=6;
   string NasPortID=7;
   string CircuitID=8;
   string TechProfile=9;
   string SpeedProfile=10;
}
message AddOntFullMessage{
   string CLLI=1;
   int32 SlotNumber=2;
   int32 PortNumber=3;
   int32 OntNumber=4;
   string SerialNumber=5;
   uint32 STag=6;
   uint32 CTag=7;
   string NasPortID=8;
   string CircuitID=9;
}
message AddOntReturn{
   bool Success=1;
}

message DeleteOntMessage{
   string CLLI=1;
   int32 SlotNumber=2;
   int32 PortNumber=3;
   int32 OntNumber=4;
   string SerialNumber=5;
}
message DeleteOntReturn{
   bool Success=1;
}
message ReflowMessage{
}
message ReflowReturn{
    bool Success=1;
}
message OutputMessage{
   string Something=1;
}
message OutputReturn{
   bool Success=1;
}
message FullInventoryMessage{
}
message InventoryMessage{
   string Clli=1;
}
message InventoryReturn{
   string JsonDump=1;
}
service AbstractOLT{
   rpc Echo(EchoMessage) returns (EchoReplyMessage){
      option(google.api.http)={
        post:"/v1/Echo"
	body:"*"
      };
   }
   rpc CreateChassis(AddChassisMessage) returns (AddChassisReturn) {
      option(google.api.http) = {
         post: "/v1/CreateAbstractChassis"
	 body:"*"
      };
   }
   rpc ChangeXOSUserPassword(ChangeXOSUserPasswordMessage) returns(ChangeXOSUserPasswordReturn){
      option(google.api.http)={
        post:"/v1/ChangeXOSUserPassword"
	body:"*"
      };
   }
   rpc CreateOLTChassis(AddOLTChassisMessage) returns (AddOLTChassisReturn) {
      option(google.api.http) = {
         post: "/v1/CreateOLTChassis"
	 body:"*"
      };
   }
   rpc PreProvisionOnt(PreProvisionOntMessage) returns (AddOntReturn) {
      option(google.api.http) = {
         post:"/v1/PreProvsionOnt"
	 body:"*"
      };
   }
   rpc ActivateSerial(AddOntMessage) returns (AddOntReturn) {
      option(google.api.http) = {
         post:"/v1/ActivateSerial"
	 body:"*"
      };
   }
   rpc ProvisionOnt(AddOntMessage) returns (AddOntReturn) {
      option(google.api.http) = {
         post:"/v1/ProvsionOnt"
	 body:"*"
      };
   }
   rpc ProvisionOntFull(AddOntFullMessage) returns (AddOntReturn) {
      option(google.api.http) = {
         post:"/v1/ProvsionOtFull"
	 body:"*"
      };
   }
   rpc DeleteOnt(DeleteOntMessage) returns (DeleteOntReturn){
      option(google.api.http)={
        post:"/v1/DeleteOnt"
	body:"*"
      };
   }
   rpc Reflow(ReflowMessage)returns (ReflowReturn){
       option(google.api.http)={
           post:"/v1/Reflow"
           body:"*"

       };
   }
   rpc Output(OutputMessage)returns(OutputReturn){
      option(google.api.http)={
        post:"/v1/Output"
	    body:"*"
      };
   }
   rpc GetFullInventory(FullInventoryMessage)returns(InventoryReturn){
      option(google.api.http)={
        post:"/v1/FullInventory"
	    body:"*"
      };
   }
   rpc GetInventory(InventoryMessage)returns(InventoryReturn){
      option(google.api.http)={
        post:"/v1/Inventory"
	    body:"*"
      };
   }
}

