in pkg/deploy/externaldns/dnsendpoint_manager.go [38:126]
func (s *defaultDnsEndpointManager) Create(ctx context.Context, service *latticemodel.Service) error {
namespacedName := types.NamespacedName{
Namespace: service.Spec.RouteNamespace,
Name: service.Spec.RouteName + "-dns",
}
if service.Spec.CustomerDomainName == "" {
s.log.Debugf(ctx, "Skipping creation of %s: detected no custom domain", namespacedName)
return nil
}
if service.Status == nil || service.Status.Dns == "" {
s.log.Debugf(ctx, "Skipping creation of %s: DNS target not ready in svc status", namespacedName)
return nil
}
var (
route core.Route
err error
)
routeNamespacedName := types.NamespacedName{
Namespace: service.Spec.RouteNamespace,
Name: service.Spec.RouteName,
}
if service.Spec.RouteType == core.GrpcRouteType {
route, err = core.GetGRPCRoute(ctx, s.k8sClient, routeNamespacedName)
} else if service.Spec.RouteType == core.TlsRouteType {
route, err = core.GetTLSRoute(ctx, s.k8sClient, routeNamespacedName)
} else {
route, err = core.GetHTTPRoute(ctx, s.k8sClient, routeNamespacedName)
}
if err != nil {
s.log.Debugf(ctx, "Skipping creation of %s: Could not find corresponding route", namespacedName.String())
return nil
}
ep := &endpoint.DNSEndpoint{}
if err := s.k8sClient.Get(ctx, namespacedName, ep); err != nil {
if apierrors.IsNotFound(err) {
s.log.Debugf(ctx, "Attempting creation of DNSEndpoint for %s - %s -> %s",
namespacedName.String(), service.Spec.CustomerDomainName, service.Status.Dns)
ep = &endpoint.DNSEndpoint{
ObjectMeta: metav1.ObjectMeta{
Name: namespacedName.Name,
Namespace: namespacedName.Namespace,
},
Spec: endpoint.DNSEndpointSpec{
Endpoints: []*endpoint.Endpoint{
{
DNSName: service.Spec.CustomerDomainName,
Targets: []string{
service.Status.Dns,
},
RecordType: "CNAME",
RecordTTL: 300,
},
},
},
}
controllerutil.SetControllerReference(route.K8sObject(), ep, s.k8sClient.Scheme())
if err = s.k8sClient.Create(ctx, ep); err != nil {
return err
}
} else if meta.IsNoMatchError(err) {
s.log.Debugf(ctx, "DNSEndpoint CRD not supported, skipping")
return nil
} else {
return err
}
} else {
s.log.Debugf(ctx, "Attempting update of DNSEndpoint for %s - %s -> %s",
namespacedName.String(), service.Spec.CustomerDomainName, service.Status.Dns)
old := ep.DeepCopy()
ep.Spec.Endpoints = []*endpoint.Endpoint{
{
DNSName: service.Spec.CustomerDomainName,
Targets: []string{
service.Status.Dns,
},
RecordType: "CNAME",
RecordTTL: 300,
},
}
if !reflect.DeepEqual(ep.Spec.Endpoints, old.Spec.Endpoints) {
if err = s.k8sClient.Patch(ctx, ep, client.MergeFrom(old)); err != nil {
return err
}
}
}
return nil
}