//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";

option java_multiple_files = true;
option java_package = "org.onap.osam.grpc";
option java_outer_classname = "AbstractOLTProto";

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 {
      openoltDriver= 0;
      asfvolt16Driver=1;
      adtranDriver=2;
      tibitsDriver=3;
   }
   OltDriver Driver=7;
   enum OltType{
      edgecore=0;
      adtran=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:"*"
      };
   }
}

