mirror of
https://github.com/status-im/consul.git
synced 2025-01-09 21:35:52 +00:00
b4d5178e5c
FailoverPolicy resources contain inner Reference fields. We want to ensure that components of those reference Tenancy fields left unspecified are defaulted using the tenancy of the enclosing FailoverPolicy resource. As the underlying helper being used to do the normalization calls the function modified in #18822, it also means that the PeerName field will be set to "local" for now automatically to avoid "local" != "" issues downstream.
143 lines
6.0 KiB
Go
143 lines
6.0 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
package catalog
|
|
|
|
import (
|
|
"github.com/hashicorp/consul/internal/catalog/internal/controllers"
|
|
"github.com/hashicorp/consul/internal/catalog/internal/controllers/endpoints"
|
|
"github.com/hashicorp/consul/internal/catalog/internal/controllers/failover"
|
|
"github.com/hashicorp/consul/internal/catalog/internal/controllers/nodehealth"
|
|
"github.com/hashicorp/consul/internal/catalog/internal/controllers/workloadhealth"
|
|
"github.com/hashicorp/consul/internal/catalog/internal/mappers/failovermapper"
|
|
"github.com/hashicorp/consul/internal/catalog/internal/mappers/nodemapper"
|
|
"github.com/hashicorp/consul/internal/catalog/internal/mappers/selectiontracker"
|
|
"github.com/hashicorp/consul/internal/catalog/internal/types"
|
|
"github.com/hashicorp/consul/internal/controller"
|
|
"github.com/hashicorp/consul/internal/resource"
|
|
pbcatalog "github.com/hashicorp/consul/proto-public/pbcatalog/v1alpha1"
|
|
"github.com/hashicorp/consul/proto-public/pbresource"
|
|
)
|
|
|
|
var (
|
|
// API Group Information
|
|
|
|
APIGroup = types.GroupName
|
|
VersionV1Alpha1 = types.VersionV1Alpha1
|
|
CurrentVersion = types.CurrentVersion
|
|
|
|
// Resource Kind Names.
|
|
|
|
WorkloadKind = types.WorkloadKind
|
|
ServiceKind = types.ServiceKind
|
|
ServiceEndpointsKind = types.ServiceEndpointsKind
|
|
VirtualIPsKind = types.VirtualIPsKind
|
|
NodeKind = types.NodeKind
|
|
HealthStatusKind = types.HealthStatusKind
|
|
HealthChecksKind = types.HealthChecksKind
|
|
DNSPolicyKind = types.DNSPolicyKind
|
|
FailoverPolicyKind = types.FailoverPolicyKind
|
|
|
|
// Resource Types for the v1alpha1 version.
|
|
|
|
WorkloadV1Alpha1Type = types.WorkloadV1Alpha1Type
|
|
ServiceV1Alpha1Type = types.ServiceV1Alpha1Type
|
|
ServiceEndpointsV1Alpha1Type = types.ServiceEndpointsV1Alpha1Type
|
|
VirtualIPsV1Alpha1Type = types.VirtualIPsV1Alpha1Type
|
|
NodeV1Alpha1Type = types.NodeV1Alpha1Type
|
|
HealthStatusV1Alpha1Type = types.HealthStatusV1Alpha1Type
|
|
HealthChecksV1Alpha1Type = types.HealthChecksV1Alpha1Type
|
|
DNSPolicyV1Alpha1Type = types.DNSPolicyV1Alpha1Type
|
|
FailoverPolicyV1Alpha1Type = types.FailoverPolicyV1Alpha1Type
|
|
|
|
// Resource Types for the latest version.
|
|
|
|
WorkloadType = types.WorkloadType
|
|
ServiceType = types.ServiceType
|
|
ServiceEndpointsType = types.ServiceEndpointsType
|
|
VirtualIPsType = types.VirtualIPsType
|
|
NodeType = types.NodeType
|
|
HealthStatusType = types.HealthStatusType
|
|
HealthChecksType = types.HealthChecksType
|
|
DNSPolicyType = types.DNSPolicyType
|
|
FailoverPolicyType = types.FailoverPolicyType
|
|
|
|
// Controller Statuses
|
|
NodeHealthStatusKey = nodehealth.StatusKey
|
|
NodeHealthStatusConditionHealthy = nodehealth.StatusConditionHealthy
|
|
NodeHealthConditions = nodehealth.Conditions
|
|
|
|
WorkloadHealthStatusKey = workloadhealth.StatusKey
|
|
WorkloadHealthStatusConditionHealthy = workloadhealth.StatusConditionHealthy
|
|
WorkloadHealthConditions = workloadhealth.WorkloadConditions
|
|
WorkloadAndNodeHealthConditions = workloadhealth.NodeAndWorkloadConditions
|
|
|
|
EndpointsStatusKey = endpoints.StatusKey
|
|
EndpointsStatusConditionEndpointsManaged = endpoints.StatusConditionEndpointsManaged
|
|
EndpointsStatusConditionManaged = endpoints.ConditionManaged
|
|
EndpointsStatusConditionUnmanaged = endpoints.ConditionUnmanaged
|
|
|
|
FailoverStatusKey = failover.StatusKey
|
|
FailoverStatusConditionAccepted = failover.StatusConditionAccepted
|
|
FailoverStatusConditionAcceptedOKReason = failover.OKReason
|
|
FailoverStatusConditionAcceptedMissingServiceReason = failover.MissingServiceReason
|
|
FailoverStatusConditionAcceptedUnknownPortReason = failover.UnknownPortReason
|
|
FailoverStatusConditionAcceptedMissingDestinationServiceReason = failover.MissingDestinationServiceReason
|
|
FailoverStatusConditionAcceptedUnknownDestinationPortReason = failover.UnknownDestinationPortReason
|
|
FailoverStatusConditionAcceptedUsingMeshDestinationPortReason = failover.UsingMeshDestinationPortReason
|
|
)
|
|
|
|
// RegisterTypes adds all resource types within the "catalog" API group
|
|
// to the given type registry
|
|
func RegisterTypes(r resource.Registry) {
|
|
types.Register(r)
|
|
}
|
|
|
|
type ControllerDependencies = controllers.Dependencies
|
|
|
|
func DefaultControllerDependencies() ControllerDependencies {
|
|
return ControllerDependencies{
|
|
WorkloadHealthNodeMapper: nodemapper.New(),
|
|
EndpointsWorkloadMapper: selectiontracker.New(),
|
|
FailoverMapper: failovermapper.New(),
|
|
}
|
|
}
|
|
|
|
// RegisterControllers registers controllers for the catalog types with
|
|
// the given controller Manager.
|
|
func RegisterControllers(mgr *controller.Manager, deps ControllerDependencies) {
|
|
controllers.Register(mgr, deps)
|
|
}
|
|
|
|
// SimplifyFailoverPolicy fully populates the PortConfigs map and clears the
|
|
// Configs map using the provided Service.
|
|
func SimplifyFailoverPolicy(svc *pbcatalog.Service, failover *pbcatalog.FailoverPolicy) *pbcatalog.FailoverPolicy {
|
|
return types.SimplifyFailoverPolicy(svc, failover)
|
|
}
|
|
|
|
// FailoverPolicyMapper maintains the bidirectional tracking relationship of a
|
|
// FailoverPolicy to the Services related to it.
|
|
type FailoverPolicyMapper interface {
|
|
TrackFailover(failover *resource.DecodedResource[*pbcatalog.FailoverPolicy])
|
|
UntrackFailover(failoverID *pbresource.ID)
|
|
FailoverIDsByService(svcID *pbresource.ID) []*pbresource.ID
|
|
}
|
|
|
|
func NewFailoverPolicyMapper() FailoverPolicyMapper {
|
|
return failovermapper.New()
|
|
}
|
|
|
|
// ValidateLocalServiceRefNoSection ensures the following:
|
|
//
|
|
// - ref is non-nil
|
|
// - type is ServiceType
|
|
// - section is empty
|
|
// - tenancy is set and partition/namespace are both non-empty
|
|
// - peer_name must be "local"
|
|
//
|
|
// Each possible validation error is wrapped in the wrapErr function before
|
|
// being collected in a multierror.Error.
|
|
func ValidateLocalServiceRefNoSection(ref *pbresource.Reference, wrapErr func(error) error) error {
|
|
return types.ValidateLocalServiceRefNoSection(ref, wrapErr)
|
|
}
|