f198544270
* Stub Config Entries for Consul Native API Gateway (#15644) * Add empty InlineCertificate struct and protobuf * apigateway stubs * Stub HTTPRoute in api pkg * Stub HTTPRoute in structs pkg * Simplify api.APIGatewayConfigEntry to be consistent w/ other entries * Update makeConfigEntry switch, add docstring for HTTPRouteConfigEntry * Add TCPRoute to MakeConfigEntry, return unique Kind * Stub BoundAPIGatewayConfigEntry in agent * Add RaftIndex to APIGatewayConfigEntry stub * Add new config entry kinds to validation allow-list * Add RaftIndex to other added config entry stubs * Update usage metrics assertions to include new cfg entries * Add Meta and acl.EnterpriseMeta to all new ConfigEntry types * Remove unnecessary Services field from added config entry types * Implement GetMeta(), GetEnterpriseMeta() for added config entry types * Add meta field to proto, name consistently w/ existing config entries * Format config_entry.proto * Add initial implementation of CanRead + CanWrite for new config entry types * Add unit tests for decoding of new config entry types * Add unit tests for parsing of new config entry types * Add unit tests for API Gateway config entry ACLs * Return typed PermissionDeniedError on BoundAPIGateway CanWrite * Add unit tests for added config entry ACLs * Add BoundAPIGateway type to AllConfigEntryKinds * Return proper kind from BoundAPIGateway * Add docstrings for new config entry types * Add missing config entry kinds to proto def * Update usagemetrics_oss_test.go * Use utility func for returning PermissionDeniedError * EventPublisher subscriptions for Consul Native API Gateway (#15757) * Create new event topics in subscribe proto * Add tests for PBSubscribe func * Make configs singular, add all configs to PBToStreamSubscribeRequest * Add snapshot methods * Add config_entry_events tests * Add config entry kind to topic for new configs * Add unit tests for snapshot methods * Start adding integration test * Test using the new controller code * Update agent/consul/state/config_entry_events.go * Check value of error * Add controller stubs for API Gateway (#15837) * update initial stub implementation * move files, clean up mutex references * Remove embed, use idiomatic names for constructors * Remove stray file introduced in merge * Add APIGateway validation (#15847) * Add APIGateway validation * Add additional validations * Add cert ref validation * Add protobuf definitions * Fix up field types * Add API structs * Move struct fields around a bit * APIGateway InlineCertificate validation (#15856) * Add APIGateway validation * Add additional validations * Add protobuf definitions * Tabs to spaces * Add API structs * Move struct fields around a bit * Add validation for InlineCertificate * Fix ACL test * APIGateway BoundAPIGateway validation (#15858) * Add APIGateway validation * Add additional validations * Add cert ref validation * Add protobuf definitions * Fix up field types * Add API structs * Move struct fields around a bit * Add validation for BoundAPIGateway * APIGateway TCPRoute validation (#15855) * Add APIGateway validation * Add additional validations * Add cert ref validation * Add protobuf definitions * Fix up field types * Add API structs * Add TCPRoute normalization and validation * Add forgotten Status * Add some more field docs in api package * Fix test * Format imports * Rename snapshot test variable names * Add plumbing for Native API GW Subscriptions (#16003) Co-authored-by: Sarah Alsmiller <sarah.alsmiller@hashicorp.com> Co-authored-by: Nathan Coleman <nathan.coleman@hashicorp.com> Co-authored-by: sarahalsmiller <100602640+sarahalsmiller@users.noreply.github.com> Co-authored-by: Andrew Stucki <andrew.stucki@hashicorp.com>
69 lines
2.4 KiB
Go
69 lines
2.4 KiB
Go
package state
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/hashicorp/consul/acl"
|
|
"github.com/hashicorp/consul/agent/consul/stream"
|
|
"github.com/hashicorp/consul/proto/pbsubscribe"
|
|
)
|
|
|
|
// PBToStreamSubscribeRequest takes a protobuf subscribe request and enterprise
|
|
// metadata to properly generate the matching stream subscribe request.
|
|
func PBToStreamSubscribeRequest(req *pbsubscribe.SubscribeRequest, entMeta acl.EnterpriseMeta) (*stream.SubscribeRequest, error) {
|
|
var subject stream.Subject
|
|
|
|
if req.GetWildcardSubject() {
|
|
subject = stream.SubjectWildcard
|
|
} else {
|
|
named := req.GetNamedSubject()
|
|
|
|
// Support the (deprecated) top-level Key, Partition, Namespace, and PeerName fields.
|
|
if named == nil {
|
|
named = &pbsubscribe.NamedSubject{
|
|
Key: req.Key, // nolint:staticcheck // SA1019 intentional use of deprecated field
|
|
Partition: req.Partition, // nolint:staticcheck // SA1019 intentional use of deprecated field
|
|
Namespace: req.Namespace, // nolint:staticcheck // SA1019 intentional use of deprecated field
|
|
PeerName: req.PeerName, // nolint:staticcheck // SA1019 intentional use of deprecated field
|
|
}
|
|
}
|
|
|
|
if named.Key == "" {
|
|
return nil, errors.New("either WildcardSubject or NamedSubject.Key is required")
|
|
}
|
|
|
|
switch req.Topic {
|
|
case EventTopicServiceHealth, EventTopicServiceHealthConnect:
|
|
subject = EventSubjectService{
|
|
Key: named.Key,
|
|
EnterpriseMeta: entMeta,
|
|
PeerName: named.PeerName,
|
|
}
|
|
case EventTopicMeshConfig, EventTopicServiceResolver, EventTopicIngressGateway,
|
|
EventTopicServiceIntentions, EventTopicServiceDefaults, EventTopicAPIGateway,
|
|
EventTopicTCPRoute, EventTopicHTTPRoute, EventTopicInlineCertificate,
|
|
EventTopicBoundAPIGateway:
|
|
subject = EventSubjectConfigEntry{
|
|
Name: named.Key,
|
|
EnterpriseMeta: &entMeta,
|
|
}
|
|
case EventTopicServiceList:
|
|
// Events on this topic are published to SubjectNone, but rather than
|
|
// exposing this in (and further complicating) the streaming API we rely
|
|
// on consumers passing WildcardSubject instead, which is functionally the
|
|
// same for this purpose.
|
|
return nil, fmt.Errorf("topic %s can only be consumed using WildcardSubject", EventTopicServiceList)
|
|
default:
|
|
return nil, fmt.Errorf("cannot construct subject for topic %s", req.Topic)
|
|
}
|
|
}
|
|
|
|
return &stream.SubscribeRequest{
|
|
Topic: req.Topic,
|
|
Subject: subject,
|
|
Token: req.Token,
|
|
Index: req.Index,
|
|
}, nil
|
|
}
|