Search in sources :

Example 1 with DnsRecord

use of com.enonic.kubernetes.apis.cloudflare.service.model.DnsRecord in project xp-operator by enonic.

the class OperatorDomainDns method syncDnsRecords.

private void syncDnsRecords(final DomainConfig config, final Domain domain, final boolean delete) {
    // Check for ips
    List<String> ips = domain.getStatus().getDomainStatusFields().getPublicIps();
    if (ips.size() == 0) {
        log.warn("Domain does not have an external IP, not altering records");
        updateStatus(domain, DomainStatus.State.ERROR, "No external IP found", false);
        return;
    }
    // Get current records
    List<DnsRecord> records = dnsRecordService.list(config.zoneId(), domain.getSpec().getHost(), null);
    // If we are not suppose to create records
    if (records.size() == 0 && !domain.getSpec().getDnsRecord()) {
        updateStatus(domain, DomainStatus.State.READY, "OK", false);
        return;
    }
    // Get heritage record
    DnsRecord heritageRecord = getHeritageRecord(records);
    if (records.size() > 0 && heritageRecord == null) {
        log.warn(String.format("Present heritage record does not match this cluster id for domain '%s'", domain.getSpec().getHost()));
        updateStatus(domain, DomainStatus.State.ERROR, "Heritage record mismatch", false);
        return;
    }
    // Collect A records
    List<DnsRecord> aRecords = records.stream().filter(r -> "A".equals(r.type())).collect(Collectors.toList());
    List<DnsRecord> toAdd = new LinkedList<>();
    List<DnsRecord> toModify = new LinkedList<>();
    List<DnsRecord> toRemove = new LinkedList<>();
    if (delete) {
        // Remove all records on delete
        toRemove.addAll(records);
    } else {
        // Add heritage record
        if (heritageRecord == null) {
            toAdd.add(ImmutableDnsRecord.builder().zone_id(config.zoneId()).name(domain.getSpec().getHost()).ttl(domain.getSpec().getDnsTTL()).type("TXT").content(createHeritageRecord()).build());
        }
        // Remove all records that do not have the current IPs the lb has
        aRecords.stream().filter(r -> !ips.contains(r.content())).forEach(toRemove::add);
        // Add all records missing
        List<String> currentRecordIps = aRecords.stream().map(DnsRecord::content).collect(Collectors.toList());
        ips.stream().filter(ip -> !currentRecordIps.contains(ip)).forEach(ip -> toAdd.add(ImmutableDnsRecord.builder().zone_id(config.zoneId()).name(domain.getSpec().getHost()).ttl(domain.getSpec().getDnsTTL()).content(ip).type("A").proxied(domain.getSpec().getCdn()).build()));
        // Modify records that needed modification
        aRecords.stream().filter(r -> !toRemove.contains(r)).forEach(r -> {
            if (!r.ttl().equals(domain.getSpec().getDnsTTL()) || r.proxied() != domain.getSpec().getCdn()) {
                toModify.add(ImmutableDnsRecord.builder().from(r).ttl(domain.getSpec().getDnsTTL()).proxied(domain.getSpec().getCdn()).build());
            }
        });
    }
    // Collect commands
    List<Runnable> commands = new LinkedList<>();
    toAdd.stream().forEach(r -> commands.add(dnsRecordService.create(r)));
    toModify.stream().forEach(r -> commands.add(dnsRecordService.update(r)));
    toRemove.stream().forEach(r -> commands.add(dnsRecordService.delete(r)));
    if (!delete) {
        updateStatus(domain, DomainStatus.State.READY, "OK", true);
    }
    try {
        runnableListExecutor.apply(commands);
    } catch (Exception e) {
        updateStatus(domain, DomainStatus.State.ERROR, "Faild updating records, see operator logs", false);
        log.error("Failed calling CF: " + e.getMessage());
    }
}
Also used : Clients(com.enonic.kubernetes.kubernetes.Clients) ImmutableDnsRecord(com.enonic.kubernetes.apis.cloudflare.service.model.ImmutableDnsRecord) LoggerFactory(org.slf4j.LoggerFactory) DomainStatus(com.enonic.kubernetes.client.v1.domain.DomainStatus) RunnableListExecutor(com.enonic.kubernetes.common.functions.RunnableListExecutor) Inject(javax.inject.Inject) Informers(com.enonic.kubernetes.kubernetes.Informers) K8sLogHelper(com.enonic.kubernetes.kubernetes.commands.K8sLogHelper) Observes(javax.enterprise.event.Observes) Configuration.cfgStr(com.enonic.kubernetes.common.Configuration.cfgStr) Configuration.cfgIfBool(com.enonic.kubernetes.common.Configuration.cfgIfBool) Domain(com.enonic.kubernetes.client.v1.domain.Domain) Named(javax.inject.Named) LinkedList(java.util.LinkedList) Logger(org.slf4j.Logger) Searchers(com.enonic.kubernetes.kubernetes.Searchers) DnsRecordServiceWrapper(com.enonic.kubernetes.apis.cloudflare.DnsRecordServiceWrapper) DnsRecord(com.enonic.kubernetes.apis.cloudflare.service.model.DnsRecord) Collectors(java.util.stream.Collectors) Objects(java.util.Objects) Consumer(java.util.function.Consumer) List(java.util.List) DohAnswer(com.enonic.kubernetes.apis.doh.service.DohAnswer) DohServiceWrapper(com.enonic.kubernetes.apis.doh.DohServiceWrapper) InformerEventHandler(com.enonic.kubernetes.operator.helpers.InformerEventHandler) ApplicationScoped(javax.enterprise.context.ApplicationScoped) StartupEvent(io.quarkus.runtime.StartupEvent) ConfigProperty(org.eclipse.microprofile.config.inject.ConfigProperty) ImmutableDnsRecord(com.enonic.kubernetes.apis.cloudflare.service.model.ImmutableDnsRecord) DnsRecord(com.enonic.kubernetes.apis.cloudflare.service.model.DnsRecord) LinkedList(java.util.LinkedList)

Aggregations

DnsRecordServiceWrapper (com.enonic.kubernetes.apis.cloudflare.DnsRecordServiceWrapper)1 DnsRecord (com.enonic.kubernetes.apis.cloudflare.service.model.DnsRecord)1 ImmutableDnsRecord (com.enonic.kubernetes.apis.cloudflare.service.model.ImmutableDnsRecord)1 DohServiceWrapper (com.enonic.kubernetes.apis.doh.DohServiceWrapper)1 DohAnswer (com.enonic.kubernetes.apis.doh.service.DohAnswer)1 Domain (com.enonic.kubernetes.client.v1.domain.Domain)1 DomainStatus (com.enonic.kubernetes.client.v1.domain.DomainStatus)1 Configuration.cfgIfBool (com.enonic.kubernetes.common.Configuration.cfgIfBool)1 Configuration.cfgStr (com.enonic.kubernetes.common.Configuration.cfgStr)1 RunnableListExecutor (com.enonic.kubernetes.common.functions.RunnableListExecutor)1 Clients (com.enonic.kubernetes.kubernetes.Clients)1 Informers (com.enonic.kubernetes.kubernetes.Informers)1 Searchers (com.enonic.kubernetes.kubernetes.Searchers)1 K8sLogHelper (com.enonic.kubernetes.kubernetes.commands.K8sLogHelper)1 InformerEventHandler (com.enonic.kubernetes.operator.helpers.InformerEventHandler)1 StartupEvent (io.quarkus.runtime.StartupEvent)1 LinkedList (java.util.LinkedList)1 List (java.util.List)1 Objects (java.util.Objects)1 Consumer (java.util.function.Consumer)1