syntax = "proto3";

option go_package = "github.com/opencord/voltha-protos/v5/go/adapter_service";
option java_package = "org.opencord.voltha.adapter_service";
option java_outer_classname = "VolthaAdapterService";

package adapter_service;

import "google/protobuf/empty.proto";
import "voltha_protos/common.proto";
import "voltha_protos/core_adapter.proto";
import "voltha_protos/device.proto";
import "voltha_protos/extensions.proto";
import "voltha_protos/health.proto";
import "voltha_protos/voltha.proto";
import "voltha_protos/omci_test.proto";
import "voltha_protos/events.proto";

// AdapterService is a gRPC service to serve requests from Voltha RW_Core.
service AdapterService {
    // GetHealthStatus is used by an AdapterService client to verify connectivity
    // to the gRPC server hosting the AdapterService service
    rpc GetHealthStatus(common.Connection) returns (health.HealthStatus);

    // Device
    rpc AdoptDevice(device.Device) returns(google.protobuf.Empty);
    rpc ReconcileDevice(device.Device) returns(google.protobuf.Empty);
    rpc DeleteDevice(device.Device) returns(google.protobuf.Empty);
    rpc DisableDevice(device.Device) returns(google.protobuf.Empty);
    rpc ReEnableDevice(device.Device) returns(google.protobuf.Empty);
    rpc RebootDevice(device.Device) returns(google.protobuf.Empty);
    rpc SelfTestDevice(device.Device) returns(google.protobuf.Empty);
    rpc GetOfpDeviceInfo(device.Device) returns(core_adapter.SwitchCapability);
    rpc ChildDeviceLost(device.Device) returns(google.protobuf.Empty);

    // Ports
    rpc EnablePort(device.Port) returns(google.protobuf.Empty);
    rpc DisablePort(device.Port) returns(google.protobuf.Empty);

    // Flows
    rpc UpdateFlowsBulk(core_adapter.BulkFlows) returns(google.protobuf.Empty);
    rpc UpdateFlowsIncrementally(core_adapter.IncrementalFlows) returns(google.protobuf.Empty);

    //Packets
    rpc SendPacketOut(core_adapter.PacketOut) returns(google.protobuf.Empty);

    // PM
    rpc UpdatePmConfig(core_adapter.PmConfigsInfo) returns(google.protobuf.Empty);

    // Image
    rpc DownloadOnuImage(device.DeviceImageDownloadRequest) returns (device.DeviceImageResponse);
    rpc GetOnuImageStatus(device.DeviceImageRequest) returns (device.DeviceImageResponse);
    rpc AbortOnuImageUpgrade(device.DeviceImageRequest) returns (device.DeviceImageResponse);
    rpc GetOnuImages(common.ID) returns (device.OnuImages);
    rpc ActivateOnuImage(device.DeviceImageRequest) returns (device.DeviceImageResponse);
    rpc CommitOnuImage(device.DeviceImageRequest) returns (device.DeviceImageResponse);

    // Deprecated Image APIs
    rpc DownloadImage(core_adapter.ImageDownloadMessage) returns (device.ImageDownload) {
        option deprecated = true;
    };
    rpc GetImageDownloadStatus(core_adapter.ImageDownloadMessage) returns (device.ImageDownload) {
        option deprecated = true;
    };
    rpc CancelImageDownload(core_adapter.ImageDownloadMessage) returns (device.ImageDownload) {
        option deprecated = true;
    };
    rpc ActivateImageUpdate(core_adapter.ImageDownloadMessage) returns (device.ImageDownload) {
        option deprecated = true;
    };
    rpc RevertImageUpdate(core_adapter.ImageDownloadMessage) returns (device.ImageDownload) {
        option deprecated = true;
    };

    // Tests
    rpc StartOmciTest(core_adapter.OMCITest) returns(omci.TestResponse);
    rpc SimulateAlarm(core_adapter.SimulateAlarmMessage) returns (common.OperationResp);

    // Events
    rpc SuppressEvent(event.EventFilter) returns(google.protobuf.Empty);
    rpc UnSuppressEvent(event.EventFilter) returns(google.protobuf.Empty);

    // Get/Set
    rpc GetExtValue(core_adapter.GetExtValueMessage) returns (extension.ReturnValues);
    rpc SetExtValue(core_adapter.SetExtValueMessage) returns (google.protobuf.Empty);
    rpc GetSingleValue(extension.SingleGetValueRequest) returns (extension.SingleGetValueResponse);
    rpc SetSingleValue(extension.SingleSetValueRequest) returns (extension.SingleSetValueResponse);
}
