package io.fathom.cloud.compute.services; import io.fathom.cloud.dns.DnsService; import io.fathom.cloud.dns.DnsService.DnsRecordSpec; import io.fathom.cloud.dns.DnsService.DnsRecordsetSpec; import io.fathom.cloud.openstack.client.loadbalance.model.LbaasMapping; import io.fathom.cloud.protobuf.CloudModel.InstanceData; import io.fathom.cloud.protobuf.CloudModel.MetadataData; import io.fathom.cloud.protobuf.CloudModel.MetadataEntryData; import io.fathom.cloud.protobuf.CloudModel.NetworkAddressData; import java.net.Inet6Address; import java.net.InetAddress; import java.util.List; import javax.inject.Inject; import com.google.common.collect.Lists; import com.google.common.net.InetAddresses; public class DerivedMetadata { public static final String KEY_DNS_HOST = "__dns:host"; public static final String KEY_LOADBALANCE_HOST = "__loadbalance:host"; public static final String KEY_ROLE = "__role"; @Inject DnsService dnsService; private final List<DnsRecordsetSpec> dnsRecordsets = Lists.newArrayList(); private final List<LbaasMapping> lbaasMappings = Lists.newArrayList(); private final List<String> roles = Lists.newArrayList(); private List<InetAddress> publicIps; public void build(InstanceData instance) { MetadataData metadata = instance.getMetadata(); this.publicIps = getIps(instance, true); for (MetadataEntryData entry : metadata.getEntryList()) { String key = entry.getKey(); String value = entry.getValue(); if (key.equals(KEY_DNS_HOST)) { addDnsHost(instance, value); } if (key.equals(KEY_LOADBALANCE_HOST)) { addLbaasMapping(instance, value); } if (key.equals(KEY_ROLE)) { roles.add(value); } } } private void addDnsHost(InstanceData instance, String fqdn) { for (InetAddress ip : publicIps) { DnsRecordsetSpec recordset = new DnsRecordsetSpec(); recordset.fqdn = fqdn; recordset.records = Lists.newArrayList(); DnsRecordSpec record = new DnsRecordSpec(); record.address = InetAddresses.toAddrString(ip); recordset.records.add(record); String type = (ip instanceof Inet6Address ? DnsService.TYPE_AAAA : DnsService.TYPE_A); recordset.type = type; dnsRecordsets.add(recordset); } } private void addLbaasMapping(InstanceData instance, String fqdn) { for (InetAddress ip : publicIps) { LbaasMapping lbaasMapping = new LbaasMapping(); lbaasMapping.host = fqdn; String address = InetAddresses.toAddrString(ip); lbaasMapping.ip = address; lbaasMappings.add(lbaasMapping); } } private List<InetAddress> getIps(InstanceData instance, boolean findPublic) { List<InetAddress> addresses = Lists.newArrayList(); for (NetworkAddressData network : instance.getNetwork().getAddressesList()) { if (findPublic != network.getPublicAddress()) { continue; } String ip = network.getIp(); InetAddress addr = InetAddresses.forString(ip); addresses.add(addr); } return addresses; } public List<DnsRecordsetSpec> getDnsRecordsets() { return dnsRecordsets; } public List<LbaasMapping> getLbaasMappings() { return lbaasMappings; } public List<String> getRoles() { return roles; } public List<InetAddress> getPublicIps() { return publicIps; } }