diff --git a/pkg/cache/v3/cache.go b/pkg/cache/v3/cache.go index abb1195b7c..46d114cb50 100644 --- a/pkg/cache/v3/cache.go +++ b/pkg/cache/v3/cache.go @@ -23,11 +23,13 @@ import ( discovery "github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3" + "github.com/golang/protobuf/proto" + + "github.com/golang/protobuf/ptypes" "github.com/golang/protobuf/ptypes/any" "github.com/envoyproxy/go-control-plane/pkg/cache/types" "github.com/envoyproxy/go-control-plane/pkg/server/stream/v3" - ttl "github.com/envoyproxy/go-control-plane/pkg/ttl/v3" ) // Request is an alias for the discovery request type. @@ -189,7 +191,7 @@ func (r *RawResponse) GetDiscoveryResponse() (*discovery.DiscoveryResponse, erro marshaledResources := make([]*any.Any, len(r.Resources)) for i, resource := range r.Resources { - maybeTtldResource, resourceType, err := ttl.MaybeCreateTtlResourceIfSupported(resource, GetResourceName(resource.Resource), r.Request.TypeUrl, r.Heartbeat) + maybeTtldResource, resourceType, err := r.maybeCreateTtlResource(resource) if err != nil { return nil, err } @@ -281,6 +283,30 @@ func (r *RawDeltaResponse) GetNextVersionMap() map[string]string { return r.NextVersionMap } +var deltaResourceTypeURL = "type.googleapis.com/" + proto.MessageName(&discovery.Resource{}) + +func (r *RawResponse) maybeCreateTtlResource(resource types.ResourceWithTtl) (types.Resource, string, error) { + if resource.Ttl != nil { + wrappedResource := &discovery.Resource{ + Name: GetResourceName(resource.Resource), + Ttl: ptypes.DurationProto(*resource.Ttl), + } + + if !r.Heartbeat { + any, err := ptypes.MarshalAny(resource.Resource) + if err != nil { + return nil, "", err + } + any.TypeUrl = r.Request.TypeUrl + wrappedResource.Resource = any + } + + return wrappedResource, deltaResourceTypeURL, nil + } + + return resource.Resource, r.Request.TypeUrl, nil +} + // GetDiscoveryResponse returns the final passthrough Discovery Response. func (r *PassthroughResponse) GetDiscoveryResponse() (*discovery.DiscoveryResponse, error) { return r.DiscoveryResponse, nil diff --git a/pkg/cache/v3/cache_test.go b/pkg/cache/v3/cache_test.go index 854e0fae65..81e8dd1b80 100644 --- a/pkg/cache/v3/cache_test.go +++ b/pkg/cache/v3/cache_test.go @@ -12,7 +12,6 @@ import ( "github.com/envoyproxy/go-control-plane/pkg/cache/types" "github.com/envoyproxy/go-control-plane/pkg/cache/v3" "github.com/envoyproxy/go-control-plane/pkg/resource/v3" - ttl_helper "github.com/envoyproxy/go-control-plane/pkg/ttl/v3" ) const ( @@ -81,7 +80,7 @@ func TestHeartbeatResponseGetDiscoveryResponse(t *testing.T) { assert.Nil(t, err) assert.Equal(t, discoveryResponse.VersionInfo, resp.Version) assert.Equal(t, len(discoveryResponse.Resources), 1) - assert.False(t, ttl_helper.IsTTLResource(discoveryResponse.Resources[0])) + assert.False(t, isTTLResource(discoveryResponse.Resources[0])) cachedResponse, err := resp.GetDiscoveryResponse() assert.Nil(t, err) @@ -92,3 +91,13 @@ func TestHeartbeatResponseGetDiscoveryResponse(t *testing.T) { assert.Nil(t, err) assert.Equal(t, r.Name, resourceName) } + +func isTTLResource(resource *any.Any) bool { + wrappedResource := &discovery.Resource{} + err := ptypes.UnmarshalAny(resource, wrappedResource) + if err != nil { + return false + } + + return wrappedResource.Resource == nil +} diff --git a/pkg/cache/v3/resource.go b/pkg/cache/v3/resource.go index 7170e9e712..c7eac67fb8 100644 --- a/pkg/cache/v3/resource.go +++ b/pkg/cache/v3/resource.go @@ -93,7 +93,6 @@ func GetResourceName(res types.Resource) string { case *runtime.Runtime: return v.GetName() case *core.TypedExtensionConfig: - // This is a V3 proto, but this is the easiest workaround for the fact that there is no V2 proto. return v.GetName() default: return "" diff --git a/pkg/ttl/v3/ttl.go b/pkg/ttl/v3/ttl.go deleted file mode 100644 index 4e1265a4af..0000000000 --- a/pkg/ttl/v3/ttl.go +++ /dev/null @@ -1,49 +0,0 @@ -package ttl - -import ( - "github.com/golang/protobuf/proto" - "github.com/golang/protobuf/ptypes" - "github.com/golang/protobuf/ptypes/any" - - discovery "github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3" - "github.com/envoyproxy/go-control-plane/pkg/cache/types" -) - -var deltaResourceTypeURL = "type.googleapis.com/" + proto.MessageName(&discovery.Resource{}) - -// Helper functions for interacting with TTL resources for xDS V3. A resource will be wrapped in a discovery.Resource in order -// to allow specifying a TTL. If the resource is meant to be a heartbeat response, only the resource name and TTL will be set -// to avoid having to send the entire resource down. - -func MaybeCreateTtlResourceIfSupported(resource types.ResourceWithTtl, name string, resourceTypeUrl string, heartbeat bool) (types.Resource, string, error) { - if resource.Ttl != nil { - wrappedResource := &discovery.Resource{ - Name: name, - Ttl: ptypes.DurationProto(*resource.Ttl), - } - - if !heartbeat { - any, err := ptypes.MarshalAny(resource.Resource) - if err != nil { - return nil, "", err - } - any.TypeUrl = resourceTypeUrl - wrappedResource.Resource = any - } - - return wrappedResource, deltaResourceTypeURL, nil - } - - return resource.Resource, resourceTypeUrl, nil -} - -func IsTTLResource(resource *any.Any) bool { - // This is only done in test, so no need to worry about the overhead of the marshalling. - wrappedResource := &discovery.Resource{} - err := ptypes.UnmarshalAny(resource, wrappedResource) - if err != nil { - return false - } - - return wrappedResource.Resource == nil -}