From 1bed17f9de9da7346ce04c354ee491b98577aa60 Mon Sep 17 00:00:00 2001 From: htuch Date: Mon, 11 Sep 2017 16:56:41 -0400 Subject: [PATCH] ads: workaround for proto descriptor issue, file reorg and cleanup. (#169) Turns out that files with just service methods don't get loaded into the descriptor pool automatically in C++. So, needed to have some messages in ads.proto. Turns out this was a good opportunity to move some of the messages that were related to discovery out of base.proto. This shouldn't break the API, since everything is in the envoy.api.v2 packge space. --- api/BUILD | 29 +++++----- api/ads.proto | 20 ------- api/base.proto | 49 ----------------- api/bootstrap.proto | 1 + api/cds.proto | 1 + api/discovery.proto | 68 ++++++++++++++++++++++++ api/eds.proto | 1 + api/filter/BUILD | 1 + api/filter/http_connection_manager.proto | 1 + api/lds.proto | 1 + api/rds.proto | 1 + test/build/BUILD | 2 +- test/build/build_test.cc | 7 +-- 13 files changed, 92 insertions(+), 90 deletions(-) delete mode 100644 api/ads.proto create mode 100644 api/discovery.proto diff --git a/api/BUILD b/api/BUILD index d625419c..4cfadb47 100644 --- a/api/BUILD +++ b/api/BUILD @@ -19,6 +19,7 @@ api_proto_library( deps = [ ":address", ":base", + ":discovery", ":cds", ":lds", ], @@ -35,19 +36,6 @@ api_proto_library( srcs = ["tls_context.proto"], ) -api_proto_library( - name = "ads", - srcs = ["ads.proto"], - has_services = 1, - deps = [ - ":base", - ":cds", - ":eds", - ":lds", - ":rds", - ], -) - api_proto_library( name = "cds", srcs = ["cds.proto"], @@ -55,12 +43,20 @@ api_proto_library( deps = [ ":address", ":base", + ":discovery", ":health_check", ":protocol", ":tls_context", ], ) +api_proto_library( + name = "discovery", + srcs = ["discovery.proto"], + has_services = 1, + deps = [":base"], +) + api_proto_library( name = "eds", srcs = ["eds.proto"], @@ -68,6 +64,7 @@ api_proto_library( deps = [ ":address", ":base", + ":discovery", ":health_check", ], ) @@ -89,6 +86,7 @@ api_proto_library( deps = [ ":address", ":base", + ":discovery", ":tls_context", ], ) @@ -108,5 +106,8 @@ api_proto_library( name = "rds", srcs = ["rds.proto"], has_services = 1, - deps = [":base"], + deps = [ + ":base", + ":discovery", + ], ) diff --git a/api/ads.proto b/api/ads.proto deleted file mode 100644 index 4485d908..00000000 --- a/api/ads.proto +++ /dev/null @@ -1,20 +0,0 @@ -syntax = "proto3"; - -package envoy.api.v2; - -import "api/base.proto"; - -import "google/api/annotations.proto"; - -// See https://github.com/lyft/envoy-api#apis for a description of the role of -// ADS and how it is intended to be used by a management server. ADS requests -// have the same structure as their singleton xDS counterparts, but can -// multiplex many resource types on a single stream. The type_url in the -// DiscoveryRequest/DiscoveryResponse provides sufficient information to recover -// the multiplexed singleton APIs at the Envoy instance and management server. -service AggregatedDiscoveryService { - // This is a gRPC-only API. - rpc StreamAggregatedResources(stream DiscoveryRequest) - returns (stream DiscoveryResponse) { - } -} diff --git a/api/base.proto b/api/base.proto index adad60e7..68320049 100644 --- a/api/base.proto +++ b/api/base.proto @@ -4,7 +4,6 @@ package envoy.api.v2; import "api/address.proto"; -import "google/protobuf/any.proto"; import "google/protobuf/duration.proto"; import "google/protobuf/struct.proto"; import "google/protobuf/wrappers.proto"; @@ -118,54 +117,6 @@ message HeaderValueOption { google.protobuf.BoolValue append = 2; } -// A DiscoveryRequest requests a set of versioned resources of the same type for -// a given Envoy node on some API. -message DiscoveryRequest { - // The version_info provided in the request messages will be the version_info - // received with the most recent successfully processed response or empty on - // the first request. It is expected that no new request is sent after a - // response is received until the Envoy instance is ready to ACK/NACK the new - // configuration. ACK/NACK takes place by returning the new API config version - // as applied or the previous API config version respectively. Each type_url - // (see below) has an independent version associated with it. - string version_info = 1; - Node node = 2; - // List of resources to subscribe to, e.g. list of cluster names or a route - // configuration name. If this is empty, all resources for the API are - // returned. LDS/CDS expect empty resource_names, since this is global - // discovery for the Envoy instance. The LDS and CDS responses will then imply - // a number of resources that need to be fetched via EDS/RDS, which will be - // explicitly enumerated in resource_names. - repeated string resource_names = 3; - // Type of the resource that is being requested, e.g. - // "type.googleapis.com/envoy.api.v2.ClusterLoadAssignment". This is implicit - // in requests made via singleton xDS APIs such as CDS, LDS, etc. but is - // required for ADS. - string type_url = 4; -} - -message DiscoveryResponse { - string version_info = 1; - repeated google.protobuf.Any resources = 2; - // Canary is used to support two Envoy command line flags: - // * --terminate-on-canary-transition-failure. When set, Envoy is able to - // terminate if it detects that configuration is stuck at canary. Consider - // this example sequence of updates: - // - Management server applies a canary config successfully. - // - Management server rolls back to a production config. - // - Envoy rejects the new production config. - // Since there is no sensible way to continue receiving configuration - // updates, Envoy will then terminate and apply production config from a - // clean slate. - // * --dry-run-canary. When set, a canary response will never be applied, only - // validated via a dry run. - bool canary = 3; - // Type URL for resources. This must be consistent with the type_url in the - // Any messages for resources if resources is non-empty. This effectively - // identifies the xDS API when muxing over ADS. - string type_url = 4; -} - message ApiConfigSource { // APIs may be fetched via either REST or gRPC. enum ApiType { diff --git a/api/bootstrap.proto b/api/bootstrap.proto index c49594a5..0c76cc98 100644 --- a/api/bootstrap.proto +++ b/api/bootstrap.proto @@ -8,6 +8,7 @@ package envoy.api.v2; import "api/address.proto"; import "api/base.proto"; +import "api/discovery.proto"; import "api/cds.proto"; import "api/lds.proto"; diff --git a/api/cds.proto b/api/cds.proto index e7f1772d..1b19268c 100644 --- a/api/cds.proto +++ b/api/cds.proto @@ -4,6 +4,7 @@ package envoy.api.v2; import "api/address.proto"; import "api/base.proto"; +import "api/discovery.proto"; import "api/health_check.proto"; import "api/protocol.proto"; import "api/tls_context.proto"; diff --git a/api/discovery.proto b/api/discovery.proto new file mode 100644 index 00000000..9446dd89 --- /dev/null +++ b/api/discovery.proto @@ -0,0 +1,68 @@ +syntax = "proto3"; + +package envoy.api.v2; + +import "api/base.proto"; + +import "google/protobuf/any.proto"; + +// See https://github.com/lyft/envoy-api#apis for a description of the role of +// ADS and how it is intended to be used by a management server. ADS requests +// have the same structure as their singleton xDS counterparts, but can +// multiplex many resource types on a single stream. The type_url in the +// DiscoveryRequest/DiscoveryResponse provides sufficient information to recover +// the multiplexed singleton APIs at the Envoy instance and management server. +service AggregatedDiscoveryService { + // This is a gRPC-only API. + rpc StreamAggregatedResources(stream DiscoveryRequest) + returns (stream DiscoveryResponse) { + } +} + +// A DiscoveryRequest requests a set of versioned resources of the same type for +// a given Envoy node on some API. +message DiscoveryRequest { + // The version_info provided in the request messages will be the version_info + // received with the most recent successfully processed response or empty on + // the first request. It is expected that no new request is sent after a + // response is received until the Envoy instance is ready to ACK/NACK the new + // configuration. ACK/NACK takes place by returning the new API config version + // as applied or the previous API config version respectively. Each type_url + // (see below) has an independent version associated with it. + string version_info = 1; + Node node = 2; + // List of resources to subscribe to, e.g. list of cluster names or a route + // configuration name. If this is empty, all resources for the API are + // returned. LDS/CDS expect empty resource_names, since this is global + // discovery for the Envoy instance. The LDS and CDS responses will then imply + // a number of resources that need to be fetched via EDS/RDS, which will be + // explicitly enumerated in resource_names. + repeated string resource_names = 3; + // Type of the resource that is being requested, e.g. + // "type.googleapis.com/envoy.api.v2.ClusterLoadAssignment". This is implicit + // in requests made via singleton xDS APIs such as CDS, LDS, etc. but is + // required for ADS. + string type_url = 4; +} + +message DiscoveryResponse { + string version_info = 1; + repeated google.protobuf.Any resources = 2; + // Canary is used to support two Envoy command line flags: + // * --terminate-on-canary-transition-failure. When set, Envoy is able to + // terminate if it detects that configuration is stuck at canary. Consider + // this example sequence of updates: + // - Management server applies a canary config successfully. + // - Management server rolls back to a production config. + // - Envoy rejects the new production config. + // Since there is no sensible way to continue receiving configuration + // updates, Envoy will then terminate and apply production config from a + // clean slate. + // * --dry-run-canary. When set, a canary response will never be applied, only + // validated via a dry run. + bool canary = 3; + // Type URL for resources. This must be consistent with the type_url in the + // Any messages for resources if resources is non-empty. This effectively + // identifies the xDS API when muxing over ADS. + string type_url = 4; +} diff --git a/api/eds.proto b/api/eds.proto index 79c3ec1b..e3914f34 100644 --- a/api/eds.proto +++ b/api/eds.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package envoy.api.v2; import "api/base.proto"; +import "api/discovery.proto"; import "api/health_check.proto"; import "google/api/annotations.proto"; diff --git a/api/filter/BUILD b/api/filter/BUILD index 812aae71..cb66c9ed 100644 --- a/api/filter/BUILD +++ b/api/filter/BUILD @@ -7,6 +7,7 @@ api_proto_library( srcs = ["http_connection_manager.proto"], deps = [ "//api:base", + "//api:discovery", "//api:protocol", "//api:rds", ], diff --git a/api/filter/http_connection_manager.proto b/api/filter/http_connection_manager.proto index 3cafac6a..90260dff 100644 --- a/api/filter/http_connection_manager.proto +++ b/api/filter/http_connection_manager.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package envoy.api.v2.filter; import "api/base.proto"; +import "api/discovery.proto"; import "api/protocol.proto"; import "api/rds.proto"; diff --git a/api/lds.proto b/api/lds.proto index 801e73a8..aa9f7136 100644 --- a/api/lds.proto +++ b/api/lds.proto @@ -8,6 +8,7 @@ package envoy.api.v2; import "api/address.proto"; import "api/base.proto"; +import "api/discovery.proto"; import "api/tls_context.proto"; import "google/api/annotations.proto"; diff --git a/api/rds.proto b/api/rds.proto index 4e53c760..e02ec254 100644 --- a/api/rds.proto +++ b/api/rds.proto @@ -7,6 +7,7 @@ syntax = "proto3"; package envoy.api.v2; import "api/base.proto"; +import "api/discovery.proto"; import "google/api/annotations.proto"; import "google/protobuf/duration.proto"; diff --git a/test/build/BUILD b/test/build/BUILD index 342890a7..e72f194a 100644 --- a/test/build/BUILD +++ b/test/build/BUILD @@ -6,8 +6,8 @@ api_cc_test( name = "build_test", srcs = ["build_test.cc"], proto_deps = [ - "//api:ads", "//api:cds", + "//api:discovery", "//api:eds", "//api:hds", "//api:lds", diff --git a/test/build/build_test.cc b/test/build/build_test.cc index 48ebd9dd..20c2e064 100644 --- a/test/build/build_test.cc +++ b/test/build/build_test.cc @@ -1,12 +1,7 @@ #include #include -#include "api/cds.pb.h" -#include "api/eds.pb.h" -#include "api/hds.pb.h" -#include "api/lds.pb.h" -#include "api/rls.pb.h" -#include "api/rds.pb.h" +#include "google/protobuf/descriptor.h" // Basic C++ build/link validation for the v2 xDS APIs. int main(int argc, char *argv[]) {