From 5361cf9c444391da8c6205a17a7b5a40ac280085 Mon Sep 17 00:00:00 2001 From: Iryna Shustava Date: Tue, 26 Sep 2023 19:19:08 -0600 Subject: [PATCH] mesh: add ComputedDestinations and controller that computes them --- .../proxy_configuration_mapper.go | 53 ------ .../internal/types/computed_destinations.go | 17 ++ .../computed_destinations.pb.binary.go | 18 ++ .../v2beta1/computed_destinations.pb.go | 179 ++++++++++++++++++ .../v2beta1/computed_destinations.proto | 16 ++ 5 files changed, 230 insertions(+), 53 deletions(-) delete mode 100644 internal/mesh/internal/mappers/proxyconfigurationmapper/proxy_configuration_mapper.go create mode 100644 internal/mesh/internal/types/computed_destinations.go create mode 100644 proto-public/pbmesh/v2beta1/computed_destinations.pb.binary.go create mode 100644 proto-public/pbmesh/v2beta1/computed_destinations.pb.go create mode 100644 proto-public/pbmesh/v2beta1/computed_destinations.proto diff --git a/internal/mesh/internal/mappers/proxyconfigurationmapper/proxy_configuration_mapper.go b/internal/mesh/internal/mappers/proxyconfigurationmapper/proxy_configuration_mapper.go deleted file mode 100644 index efcccad80e7b..000000000000 --- a/internal/mesh/internal/mappers/proxyconfigurationmapper/proxy_configuration_mapper.go +++ /dev/null @@ -1,53 +0,0 @@ -package proxyconfigurationmapper - -import ( - "context" - - "github.com/hashicorp/consul/internal/controller" - "github.com/hashicorp/consul/internal/mesh/internal/mappers/common" - "github.com/hashicorp/consul/internal/resource/mappers/selectiontracker" - pbmesh "github.com/hashicorp/consul/proto-public/pbmesh/v2beta1" - "github.com/hashicorp/consul/proto-public/pbresource" -) - -type Mapper struct { - workloadSelectionTracker *selectiontracker.WorkloadSelectionTracker -} - -func New() *Mapper { - return &Mapper{ - workloadSelectionTracker: selectiontracker.New(), - } -} - -// MapProxyConfiguration is responsible for mapping ProxyConfiguration resources to the corresponding ComputedProxyConfiguration -// resource which are name-aligned with the workload. -func (m *Mapper) MapProxyConfiguration(ctx context.Context, rt controller.Runtime, res *pbresource.Resource) ([]controller.Request, error) { - var proxyConfig pbmesh.ProxyConfiguration - err := res.Data.UnmarshalTo(&proxyConfig) - if err != nil { - return nil, err - } - - // First, we return any existing workloads that this proxy configuration selects. - // The number of selected workloads may change in the future, but for this even we - // only need to care about triggering reconcile requests for the current ones. - requests, err := common.MapSelector(ctx, rt.Client, pbmesh.ComputedProxyConfigurationType, - proxyConfig.GetWorkloads(), res.Id.Tenancy) - if err != nil { - return nil, err - } - - // Track this proxy configuration's selector and ID in the tracker. - m.workloadSelectionTracker.TrackIDForSelector(res.Id, proxyConfig.GetWorkloads()) - - return requests, nil -} - -func (m *Mapper) ProxyConfigurationsForWorkload(name string) []*pbresource.ID { - return m.workloadSelectionTracker.GetIDsForName(name) -} - -func (m *Mapper) UntrackProxyConfiguration(id *pbresource.ID) { - m.workloadSelectionTracker.UntrackID(id) -} diff --git a/internal/mesh/internal/types/computed_destinations.go b/internal/mesh/internal/types/computed_destinations.go new file mode 100644 index 000000000000..cd9bf2cc6a51 --- /dev/null +++ b/internal/mesh/internal/types/computed_destinations.go @@ -0,0 +1,17 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: BUSL-1.1 + +package types + +import ( + "github.com/hashicorp/consul/internal/resource" + pbmesh "github.com/hashicorp/consul/proto-public/pbmesh/v2beta1" +) + +func RegisterComputedDestinations(r resource.Registry) { + r.Register(resource.Registration{ + Type: pbmesh.ComputedDestinationsType, + Proto: &pbmesh.ComputedDestinations{}, + Scope: resource.ScopeNamespace, + }) +} diff --git a/proto-public/pbmesh/v2beta1/computed_destinations.pb.binary.go b/proto-public/pbmesh/v2beta1/computed_destinations.pb.binary.go new file mode 100644 index 000000000000..468aae302470 --- /dev/null +++ b/proto-public/pbmesh/v2beta1/computed_destinations.pb.binary.go @@ -0,0 +1,18 @@ +// Code generated by protoc-gen-go-binary. DO NOT EDIT. +// source: pbmesh/v2beta1/computed_destinations.proto + +package meshv2beta1 + +import ( + "google.golang.org/protobuf/proto" +) + +// MarshalBinary implements encoding.BinaryMarshaler +func (msg *ComputedDestinations) MarshalBinary() ([]byte, error) { + return proto.Marshal(msg) +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler +func (msg *ComputedDestinations) UnmarshalBinary(b []byte) error { + return proto.Unmarshal(b, msg) +} diff --git a/proto-public/pbmesh/v2beta1/computed_destinations.pb.go b/proto-public/pbmesh/v2beta1/computed_destinations.pb.go new file mode 100644 index 000000000000..14f9dc80ea38 --- /dev/null +++ b/proto-public/pbmesh/v2beta1/computed_destinations.pb.go @@ -0,0 +1,179 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.30.0 +// protoc (unknown) +// source: pbmesh/v2beta1/computed_destinations.proto + +package meshv2beta1 + +import ( + _ "github.com/hashicorp/consul/proto-public/pbresource" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type ComputedDestinations struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // destinations is the list of explicit destinations to define for the selected workloads. + Destinations []*Destination `protobuf:"bytes,2,rep,name=destinations,proto3" json:"destinations,omitempty"` +} + +func (x *ComputedDestinations) Reset() { + *x = ComputedDestinations{} + if protoimpl.UnsafeEnabled { + mi := &file_pbmesh_v2beta1_computed_destinations_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ComputedDestinations) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ComputedDestinations) ProtoMessage() {} + +func (x *ComputedDestinations) ProtoReflect() protoreflect.Message { + mi := &file_pbmesh_v2beta1_computed_destinations_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ComputedDestinations.ProtoReflect.Descriptor instead. +func (*ComputedDestinations) Descriptor() ([]byte, []int) { + return file_pbmesh_v2beta1_computed_destinations_proto_rawDescGZIP(), []int{0} +} + +func (x *ComputedDestinations) GetDestinations() []*Destination { + if x != nil { + return x.Destinations + } + return nil +} + +var File_pbmesh_v2beta1_computed_destinations_proto protoreflect.FileDescriptor + +var file_pbmesh_v2beta1_computed_destinations_proto_rawDesc = []byte{ + 0x0a, 0x2a, 0x70, 0x62, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, + 0x65, 0x73, 0x68, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x1a, 0x21, 0x70, 0x62, 0x6d, + 0x65, 0x73, 0x68, 0x2f, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x64, 0x65, 0x73, 0x74, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, + 0x70, 0x62, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6e, 0x0a, 0x14, + 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4e, 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x68, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, + 0x73, 0x68, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x06, 0xa2, 0x93, 0x04, 0x02, 0x08, 0x03, 0x42, 0x9a, 0x02, 0x0a, + 0x21, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x32, 0x62, 0x65, 0x74, + 0x61, 0x31, 0x42, 0x19, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x44, 0x65, 0x73, 0x74, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x43, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x70, 0x62, 0x6d, 0x65, 0x73, 0x68, + 0x2f, 0x76, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x3b, 0x6d, 0x65, 0x73, 0x68, 0x76, 0x32, 0x62, + 0x65, 0x74, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x48, 0x43, 0x4d, 0xaa, 0x02, 0x1d, 0x48, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x4d, 0x65, + 0x73, 0x68, 0x2e, 0x56, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0xca, 0x02, 0x1d, 0x48, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x4d, 0x65, + 0x73, 0x68, 0x5c, 0x56, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0xe2, 0x02, 0x29, 0x48, 0x61, 0x73, + 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x4d, 0x65, + 0x73, 0x68, 0x5c, 0x56, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x20, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, + 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x4d, 0x65, 0x73, 0x68, + 0x3a, 0x3a, 0x56, 0x32, 0x62, 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var ( + file_pbmesh_v2beta1_computed_destinations_proto_rawDescOnce sync.Once + file_pbmesh_v2beta1_computed_destinations_proto_rawDescData = file_pbmesh_v2beta1_computed_destinations_proto_rawDesc +) + +func file_pbmesh_v2beta1_computed_destinations_proto_rawDescGZIP() []byte { + file_pbmesh_v2beta1_computed_destinations_proto_rawDescOnce.Do(func() { + file_pbmesh_v2beta1_computed_destinations_proto_rawDescData = protoimpl.X.CompressGZIP(file_pbmesh_v2beta1_computed_destinations_proto_rawDescData) + }) + return file_pbmesh_v2beta1_computed_destinations_proto_rawDescData +} + +var file_pbmesh_v2beta1_computed_destinations_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_pbmesh_v2beta1_computed_destinations_proto_goTypes = []interface{}{ + (*ComputedDestinations)(nil), // 0: hashicorp.consul.mesh.v2beta1.ComputedDestinations + (*Destination)(nil), // 1: hashicorp.consul.mesh.v2beta1.Destination +} +var file_pbmesh_v2beta1_computed_destinations_proto_depIdxs = []int32{ + 1, // 0: hashicorp.consul.mesh.v2beta1.ComputedDestinations.destinations:type_name -> hashicorp.consul.mesh.v2beta1.Destination + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_pbmesh_v2beta1_computed_destinations_proto_init() } +func file_pbmesh_v2beta1_computed_destinations_proto_init() { + if File_pbmesh_v2beta1_computed_destinations_proto != nil { + return + } + file_pbmesh_v2beta1_destinations_proto_init() + if !protoimpl.UnsafeEnabled { + file_pbmesh_v2beta1_computed_destinations_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ComputedDestinations); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_pbmesh_v2beta1_computed_destinations_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_pbmesh_v2beta1_computed_destinations_proto_goTypes, + DependencyIndexes: file_pbmesh_v2beta1_computed_destinations_proto_depIdxs, + MessageInfos: file_pbmesh_v2beta1_computed_destinations_proto_msgTypes, + }.Build() + File_pbmesh_v2beta1_computed_destinations_proto = out.File + file_pbmesh_v2beta1_computed_destinations_proto_rawDesc = nil + file_pbmesh_v2beta1_computed_destinations_proto_goTypes = nil + file_pbmesh_v2beta1_computed_destinations_proto_depIdxs = nil +} diff --git a/proto-public/pbmesh/v2beta1/computed_destinations.proto b/proto-public/pbmesh/v2beta1/computed_destinations.proto new file mode 100644 index 000000000000..fdf3148dc5db --- /dev/null +++ b/proto-public/pbmesh/v2beta1/computed_destinations.proto @@ -0,0 +1,16 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +syntax = "proto3"; + +package hashicorp.consul.mesh.v2beta1; + +import "pbmesh/v2beta1/destinations.proto"; +import "pbresource/annotations.proto"; + +message ComputedDestinations { + option (hashicorp.consul.resource.spec) = {scope: SCOPE_NAMESPACE}; + + // destinations is the list of explicit destinations to define for the selected workloads. + repeated Destination destinations = 2; +}