mirror of
https://github.com/coredns/coredns.git
synced 2025-08-09 15:56:59 +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>
96 lines
2.6 KiB
Go
96 lines
2.6 KiB
Go
package object
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
mcs "sigs.k8s.io/mcs-api/pkg/apis/v1alpha1"
|
|
)
|
|
|
|
// ServiceImport is a stripped down api.ServiceImport with only the items we need for CoreDNS.
|
|
type ServiceImport struct {
|
|
Version string
|
|
Name string
|
|
Namespace string
|
|
Index string
|
|
ClusterIPs []string
|
|
Type mcs.ServiceImportType
|
|
Ports []mcs.ServicePort
|
|
|
|
*Empty
|
|
}
|
|
|
|
// ServiceImportKey returns a string using for the index.
|
|
func ServiceImportKey(name, namespace string) string { return name + "." + namespace }
|
|
|
|
// ToServiceImport converts an v1alpha1.ServiceImport to a *ServiceImport.
|
|
func ToServiceImport(obj meta.Object) (meta.Object, error) {
|
|
svc, ok := obj.(*mcs.ServiceImport)
|
|
|
|
if !ok {
|
|
return nil, fmt.Errorf("unexpected object %v", obj)
|
|
}
|
|
s := &ServiceImport{
|
|
Version: svc.GetResourceVersion(),
|
|
Name: svc.GetName(),
|
|
Namespace: svc.GetNamespace(),
|
|
Index: ServiceImportKey(svc.GetName(), svc.GetNamespace()),
|
|
Type: svc.Spec.Type,
|
|
}
|
|
|
|
if len(svc.Spec.IPs) > 0 {
|
|
s.ClusterIPs = make([]string, len(svc.Spec.IPs))
|
|
copy(s.ClusterIPs, svc.Spec.IPs)
|
|
}
|
|
|
|
if len(svc.Spec.Ports) > 0 {
|
|
s.Ports = make([]mcs.ServicePort, len(svc.Spec.Ports))
|
|
copy(s.Ports, svc.Spec.Ports)
|
|
}
|
|
|
|
*svc = mcs.ServiceImport{}
|
|
return s, nil
|
|
}
|
|
|
|
var _ runtime.Object = &ServiceImport{}
|
|
|
|
// Headless returns true if the service is headless
|
|
func (s *ServiceImport) Headless() bool {
|
|
return s.Type == mcs.Headless
|
|
}
|
|
|
|
// DeepCopyObject implements the ObjectKind interface.
|
|
func (s *ServiceImport) DeepCopyObject() runtime.Object {
|
|
s1 := &ServiceImport{
|
|
Version: s.Version,
|
|
Name: s.Name,
|
|
Namespace: s.Namespace,
|
|
Index: s.Index,
|
|
Type: s.Type,
|
|
ClusterIPs: make([]string, len(s.ClusterIPs)),
|
|
Ports: make([]mcs.ServicePort, len(s.Ports)),
|
|
}
|
|
copy(s1.ClusterIPs, s.ClusterIPs)
|
|
copy(s1.Ports, s.Ports)
|
|
return s1
|
|
}
|
|
|
|
// GetNamespace implements the metav1.Object interface.
|
|
func (s *ServiceImport) GetNamespace() string { return s.Namespace }
|
|
|
|
// SetNamespace implements the metav1.Object interface.
|
|
func (s *ServiceImport) SetNamespace(namespace string) {}
|
|
|
|
// GetName implements the metav1.Object interface.
|
|
func (s *ServiceImport) GetName() string { return s.Name }
|
|
|
|
// SetName implements the metav1.Object interface.
|
|
func (s *ServiceImport) SetName(name string) {}
|
|
|
|
// GetResourceVersion implements the metav1.Object interface.
|
|
func (s *ServiceImport) GetResourceVersion() string { return s.Version }
|
|
|
|
// SetResourceVersion implements the metav1.Object interface.
|
|
func (s *ServiceImport) SetResourceVersion(version string) {}
|