mirror of
https://github.com/coredns/coredns.git
synced 2025-08-10 00:07:02 +02:00
* kubernetes: add multicluster support Add multicluster support via Multi-Cluster Services API (MCS-API) via a new option `multiclusterZones` in the kubernetes plugin. When some multicluster zones are passed to the kubernetes plugin, it will start watching the ServiceImport objects and its associated EndpointSlices. Signed-off-by: Arthur Outhenin-Chalandre <arthur@cri.epita.fr> * kubernetes: implement xfr support for multicluster zones Signed-off-by: Arthur Outhenin-Chalandre <arthur@cri.epita.fr> --------- Signed-off-by: Arthur Outhenin-Chalandre <arthur@cri.epita.fr>
65 lines
2.0 KiB
Go
65 lines
2.0 KiB
Go
package object
|
|
|
|
import (
|
|
"maps"
|
|
|
|
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
mcs "sigs.k8s.io/mcs-api/pkg/apis/v1alpha1"
|
|
)
|
|
|
|
// Endpoints is a stripped down api.Endpoints with only the items we need for CoreDNS.
|
|
type MultiClusterEndpoints struct {
|
|
Endpoints
|
|
ClusterId string
|
|
*Empty
|
|
}
|
|
|
|
// MultiClusterEndpointsKey returns a string using for the index.
|
|
func MultiClusterEndpointsKey(name, namespace string) string { return name + "." + namespace }
|
|
|
|
// EndpointSliceToEndpoints converts a *discovery.EndpointSlice to a *Endpoints.
|
|
func EndpointSliceToMultiClusterEndpoints(obj meta.Object) (meta.Object, error) {
|
|
labels := maps.Clone(obj.GetLabels())
|
|
ends, err := EndpointSliceToEndpoints(obj)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
e := &MultiClusterEndpoints{
|
|
Endpoints: *ends.(*Endpoints),
|
|
ClusterId: labels[mcs.LabelSourceCluster],
|
|
}
|
|
e.Index = MultiClusterEndpointsKey(labels[mcs.LabelServiceName], ends.GetNamespace())
|
|
|
|
return e, nil
|
|
}
|
|
|
|
var _ runtime.Object = &Endpoints{}
|
|
|
|
// DeepCopyObject implements the ObjectKind interface.
|
|
func (e *MultiClusterEndpoints) DeepCopyObject() runtime.Object {
|
|
e1 := &MultiClusterEndpoints{
|
|
ClusterId: e.ClusterId,
|
|
Endpoints: *e.Endpoints.DeepCopyObject().(*Endpoints),
|
|
}
|
|
return e1
|
|
}
|
|
|
|
// GetNamespace implements the metav1.Object interface.
|
|
func (e *MultiClusterEndpoints) GetNamespace() string { return e.Endpoints.GetNamespace() }
|
|
|
|
// SetNamespace implements the metav1.Object interface.
|
|
func (e *MultiClusterEndpoints) SetNamespace(namespace string) {}
|
|
|
|
// GetName implements the metav1.Object interface.
|
|
func (e *MultiClusterEndpoints) GetName() string { return e.Endpoints.GetName() }
|
|
|
|
// SetName implements the metav1.Object interface.
|
|
func (e *MultiClusterEndpoints) SetName(name string) {}
|
|
|
|
// GetResourceVersion implements the metav1.Object interface.
|
|
func (e *MultiClusterEndpoints) GetResourceVersion() string { return e.Endpoints.GetResourceVersion() }
|
|
|
|
// SetResourceVersion implements the metav1.Object interface.
|
|
func (e *MultiClusterEndpoints) SetResourceVersion(version string) {}
|