syntax = "proto3";

package dubbo.mesh.v1alpha1;

option go_package = "github.com/apache/dubbo-kubernetes/api/mesh/v1alpha1";

import "envoy/service/discovery/v3/discovery.proto";
import "google/protobuf/any.proto";
import "google/protobuf/duration.proto";

service DubboDiscoveryService {
  rpc StreamDubboResources(stream envoy.service.discovery.v3.DiscoveryRequest)
      returns (stream envoy.service.discovery.v3.DiscoveryResponse);
}

message DubboResource {
  message Meta {
    string name = 1;
    string mesh = 2;
    string version = 5;
    map<string, string> labels = 6;
  }
  Meta meta = 1;
  google.protobuf.Any spec = 2;
}

message ZoneHealthCheckRequest {}

message ZoneHealthCheckResponse {
  // The the interval that the global control plane
  // expects between health check pings
  google.protobuf.Duration interval = 1;
}

service GlobalDDSService {
  // StreamXDSConfigs is logically a service exposed by Zone CP so Global CP can
  // execute Config Dumps. It is however represented by bi-directional streaming
  // to leverage existing connection from Zone CP to Global CP.
  rpc StreamXDSConfigs(stream XDSConfigResponse)
      returns (stream XDSConfigRequest);
  // StreamStats is logically a service exposed by Zone CP so Global CP can
  // execute dubbo-dp stats requests. It is however represented by
  // bi-directional streaming to leverage existing connection from Zone CP to
  // Global CP.
  rpc StreamStats(stream StatsResponse) returns (stream StatsRequest);
  // StreamStats is logically a service exposed by Zone CP so Global CP can
  // execute dubbo-dp clusters request. It is however represented by
  // bi-directional streaming to leverage existing connection from Zone CP to
  // Global CP.
  rpc StreamClusters(stream ClustersResponse) returns (stream ClustersRequest);
  // HealthCheck allows us to implement a health check that works across
  // proxies, unlike HTTP/2 PING frames.
  rpc HealthCheck(ZoneHealthCheckRequest) returns (ZoneHealthCheckResponse);
}

// DDSSyncService is a service exposed by the control-plane for the
// synchronization of the resources between zone and global control-plane.
service DDSSyncService {
  // GlobalToZoneSync is logically a service exposed by global control-plane
  // that allows zone control plane to connect and synchronize resources from
  // the global control-plane to the zone control-plane. It uses delta xDS from
  // go-control-plane and responds only with the changes to the resources.
  rpc GlobalToZoneSync(stream envoy.service.discovery.v3.DeltaDiscoveryRequest)
      returns (stream envoy.service.discovery.v3.DeltaDiscoveryResponse);
  // ZoneToGlobalSync is logically a service exposed by global control-plane
  // that allows zone control plane to connect and synchronize resources to
  // the global control-plane. It uses delta xDS from go-control-plane and
  // responds only with the changes to the resources.
  rpc ZoneToGlobalSync(stream envoy.service.discovery.v3.DeltaDiscoveryResponse)
      returns (stream envoy.service.discovery.v3.DeltaDiscoveryRequest);
}

// XDSConfigRequest is a request for XDS Config Dump that is executed on Zone
// CP.
message XDSConfigRequest {
  // RequestID is a UUID of a request so we can correlate requests with response
  // on one stream.
  string request_id = 1;

  // Type of resource (Dataplane, ZoneIngress, ZoneEgress)
  string resource_type = 2;
  // Name of the resource on which we execute config dump.
  string resource_name = 3;
  // Mesh of the resource on which we execute config dump. Should be empty for
  // ZoneIngress, ZoneEgress.
  string resource_mesh = 4;
}

// XDSConfigRequest is a response containing result of XDS Config Dump execution
// on Zone CP.
message XDSConfigResponse {
  // RequestID is a UUID that was set by the Global CP.
  string request_id = 1;

  oneof result {
    // Error that was captured by the Zone CP when executing XDS Config Dump.
    string error = 2;
    // The XDS Config that is a successful result of XDS Config dump execution.
    bytes config = 3;
  }
}

// StatsRequest is a request for dubbo-dp stats that is executed on Zone CP.
message StatsRequest {
  // RequestID is a UUID of a request so we can correlate requests with response
  // on one stream.
  string request_id = 1;

  // Type of resource (Dataplane, ZoneIngress, ZoneEgress)
  string resource_type = 2;
  // Name of the resource on which we execute dubbo-dp stats request.
  string resource_name = 3;
  // Mesh of the resource on which we execute dubbo-dp stats request.
  // Should be empty for ZoneIngress, ZoneEgress.
  string resource_mesh = 4;
}

// StatsResponse is a response containing result of dubbo-dp stats execution on
// Zone CP.
message StatsResponse {
  // RequestID is a UUID that was set by the Global CP.
  string request_id = 1;

  oneof result {
    // Error that was captured by the Zone CP when executing dubbo-dp stats
    // request.
    string error = 2;
    // The stats content that is a successful result of dubbo-dp stats
    // execution.
    bytes stats = 3;
  }
}

// ClustersRequest is a request for dubbo-dp clusters that is executed on Zone
// CP.
message ClustersRequest {
  // RequestID is a UUID of a request so we can correlate requests with response
  // on one stream.
  string request_id = 1;

  // Type of resource (Dataplane, ZoneIngress, ZoneEgress)
  string resource_type = 2;
  // Name of the resource on which we execute dubbo-dp clusters request.
  string resource_name = 3;
  // Mesh of the resource on which we execute dubbo-dp clusters request.
  // Should be empty for ZoneIngress, ZoneEgress.
  string resource_mesh = 4;
}

// ClustersResponse is a response containing result of dubbo-dp clusters
// execution on Zone CP.
message ClustersResponse {
  // RequestID is a UUID that was set by the Global CP.
  string request_id = 1;

  oneof result {
    // Error that was captured by the Zone CP when executing dubbo-dp clusters
    // request.
    string error = 2;
    // The clusters content that is a successful result of dubbo-dp clusters
    // execution.
    bytes clusters = 3;
  }
}
