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());
}
}
Aggregations