package io.fathom.cloud.dns.api.os.resources; import io.fathom.cloud.Clock; import io.fathom.cloud.CloudException; import io.fathom.cloud.dns.DnsService; import io.fathom.cloud.dns.model.DnsRecord; import io.fathom.cloud.dns.model.DnsRecordset; import io.fathom.cloud.dns.model.DnsZone; import io.fathom.cloud.dns.services.DnsServiceImpl; import io.fathom.cloud.openstack.client.dns.model.Record; import io.fathom.cloud.openstack.client.dns.model.Recordset; import io.fathom.cloud.openstack.client.dns.model.RecordsetList; import io.fathom.cloud.openstack.client.dns.model.WrappedRecordset; import io.fathom.cloud.protobuf.DnsModel.DnsRecordData; import io.fathom.cloud.protobuf.DnsModel.DnsRecordsetData; import javax.inject.Inject; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.Lists; @Path("/openstack/dns/{project}/v2/zones/{zoneid}/recordsets") public class RecordsetsResource extends ZonesResourceBase { private static final Logger log = LoggerFactory.getLogger(RecordsetsResource.class); @Inject DnsServiceImpl dnsService; @PathParam("zoneid") Long zoneId; @GET public RecordsetList list() throws CloudException { return list(false); } RecordsetList list(boolean details) throws CloudException { RecordsetList recordsets = new RecordsetList(); recordsets.recordsets = Lists.newArrayList(); DnsZone domain = getZone(); for (DnsService.Recordset record : dnsService.listRecordsets(getProject(), domain)) { recordsets.recordsets.add(toModel(domain, (DnsRecordset) record, true)); } return recordsets; } @GET @Path("details") public RecordsetList listDetails() throws CloudException { return list(true); } @POST public WrappedRecordset createRecordset(WrappedRecordset request) throws CloudException { DnsZone zone = getZone(); Recordset recordset = request.recordset; DnsRecordsetData.Builder b = DnsRecordsetData.newBuilder(); b.setFqdn(recordset.name); b.setType(recordset.type); for (Record record : recordset.records) { DnsRecordData.Builder rb = b.addRecordBuilder(); if (record.value != null) { rb.setTarget(record.value); } if (record.port != null) { rb.setPort(record.port); } if (record.priority != null) { rb.setPriority(record.priority); } if (record.weight != null) { rb.setWeight(record.weight); } } DnsRecordset created = dnsService.createRecordset(getProject(), zone, b); WrappedRecordset response = new WrappedRecordset(); response.recordset = toModel(zone, created, true); return response; } @DELETE @Path("{id}") public void deleteRecordset(@PathParam("id") Long recordsetId) throws CloudException { DnsZone zone = getZone(); dnsService.deleteRecordset(getProject(), zone, recordsetId); } @GET @Path("{id}") public WrappedRecordset read(@PathParam("id") Long recordsetId) throws CloudException { DnsZone zone = getZone(); DnsService.Recordset record = dnsService.findRecordset(getProject(), zone, recordsetId); notFoundIfNull(record); WrappedRecordset response = new WrappedRecordset(); response.recordset = toModel(zone, (DnsRecordset) record, true); return response; } private DnsZone getZone() throws CloudException { DnsZone domain = dnsService.findDomain(getProject(), zoneId); notFoundIfNull(domain); return domain; } static Recordset toModel(DnsZone domain, DnsRecordset recordset, boolean details) { Recordset model = new Recordset(); // zone.id = domain.getData().getDomain(); DnsRecordsetData data = recordset.getData(); model.id = "" + data.getId(); model.type = data.getType(); model.zone_id = "" + domain.getData().getId(); model.name = recordset.getFqdn(); if (data.hasTtl()) { model.ttl = data.getTtl(); } if (data.hasWeight()) { model.weight = data.getWeight(); } model.status = "ACTIVE"; model.version = 1L; if (data.hasState()) { model.created_at = Clock.toDate(data.getState().getCreatedAt()); model.updated_at = Clock.toDate(data.getState().getUpdatedAt()); model.deleted_at = Clock.toDate(data.getState().getDeletedAt()); } if (details) { model.records = Lists.newArrayList(); for (DnsRecord record : recordset.getRecords()) { model.records.add(toModel(record)); } } return model; } static Record toModel(DnsRecord record) { DnsRecordData data = record.getData(); Record model = new Record(); if (data.hasTarget()) { model.value = data.getTarget(); } if (data.hasWeight()) { model.weight = data.getWeight(); } if (data.hasPort()) { model.port = data.getPort(); } if (data.hasPriority()) { model.priority = data.getPriority(); } return model; } }