package io.fathom.cloud.dns.backend.selfhosted; import io.fathom.cloud.CloudException; import io.fathom.cloud.dns.backend.DnsBackendBase; import io.fathom.cloud.dns.backend.selfhosted.model.ZoneData; import io.fathom.cloud.dns.model.DnsZone; import io.fathom.cloud.protobuf.DnsModel.BackendData; import io.fathom.cloud.protobuf.DnsModel.DnsBackendProviderType; import io.fathom.cloud.protobuf.DnsModel.DnsSuffixData; import io.fathom.cloud.server.model.Project; import io.fathom.cloud.storage.FileBlob; import io.fathom.cloud.storage.StorageService; import io.fathom.cloud.tasks.TaskScheduler; import java.io.IOException; import java.util.Map; import javax.inject.Inject; import javax.inject.Singleton; import com.google.common.base.Charsets; import com.google.common.io.ByteSource; import com.google.gson.Gson; @Singleton public class SelfHostedDnsBackend extends DnsBackendBase { @Inject TaskScheduler taskScheduler; @Inject StorageService storageService; @Inject Gson gson; @Override public void updateDomain(Project project, DnsZone domain) { UpdateSelfHosted job = new UpdateSelfHosted(project, domain); taskScheduler.execute(job); } @Override public String createZone(Project project, String zone, String topZone, DnsSuffixData suffixData) { // No-op? return null; } @Override public DnsBackendProviderType getType() { return DnsBackendProviderType.SELF_HOSTED; } public class UpdateSelfHosted extends UpdateDnsDomainBase { public UpdateSelfHosted(Project project, DnsZone domain) { super(project, domain); } @Override public Void call() throws CloudException, IOException { String zoneName = zone.getName(); ZoneData zoneData = new ZoneData(); zoneData.records = readFromDatabase(true); String path = "services/dns/__default/zones/" + zoneName; String bucket = "__services"; String contents = gson.toJson(zoneData); ByteSource bytes = ByteSource.wrap(contents.getBytes(Charsets.UTF_8)); String contentType = "application/json"; Map<String, String> userAttributes = null; storageService.getFileService().ensureBucket(project, bucket); storageService.getFileService().putFile(project, bucket, path, FileBlob.build(bytes), contentType, userAttributes); return null; } } public void init(BackendData backendData) { } }