package io.fathom.cloud.storage;
import io.fathom.cloud.CloudException;
import io.fathom.cloud.dns.DnsService;
import io.fathom.cloud.dns.DnsService.DnsRecordsetSpec;
import io.fathom.cloud.loadbalancer.LoadBalanceService;
import io.fathom.cloud.openstack.client.loadbalance.model.LbaasMapping;
import io.fathom.cloud.protobuf.CloudCommons.Attributes;
import io.fathom.cloud.protobuf.CloudCommons.KeyValueData;
import io.fathom.cloud.protobuf.FileModel.BucketData;
import io.fathom.cloud.server.model.Project;
import java.net.URI;
import java.util.List;
import javax.inject.Inject;
import com.google.common.collect.Lists;
public class StorageDerivedMetadataImpl implements StorageDerivedMetadata {
// Buckets can't have colons in their metadata key names...
private static final String KEY_HTTP_HOST = "__http_host";
@Inject
DnsService dnsService;
@Inject
LoadBalanceService loadBalancer;
private final List<DnsRecordsetSpec> records = Lists.newArrayList();
private final List<LbaasMapping> loadBalancerRecords = Lists.newArrayList();
void build(Project project, BucketData bucket) {
Attributes metadata = bucket.getAttributes();
for (KeyValueData entry : metadata.getUserAttributesList()) {
String key = entry.getKey();
String value = entry.getValue();
if (key.equals(KEY_HTTP_HOST)) {
addHttpHost(project, bucket, value);
}
}
}
// private void addDnsHost(InstanceInfo instance, String fqdn) {
// List<InetAddress> ips = getIps(instance, true);
//
// for (InetAddress ip : ips) {
// DnsService.Record record = dnsService.buildAddress(fqdn, ip);
// records.add(record);
// }
// }
//
// private List<InetAddress> getIps(InstanceInfo instance, boolean
// findPublic) {
// List<InetAddress> addresses = Lists.newArrayList();
// for (NetworkAddressInfo network :
// instance.getNetwork().getAddressesList()) {
// if (findPublic != network.getPublicAddress()) {
// continue;
// }
//
// String ip = network.getIp();
// InetAddress addr = InetAddresses.forString(ip);
//
// addresses.add(addr);
// }
// return addresses;
// }
private void addHttpHost(Project project, BucketData bucket, String value) {
String host = value;
String publicBucketUrl = "https://api-cloud.fathomdb.com/openstack/storage/" + project.getId() + "/"
+ bucket.getKey();
URI redirect = URI.create(publicBucketUrl);
LbaasMapping record = new LbaasMapping();
record.host = host;
record.forwardUrl = redirect.toString();
loadBalancerRecords.add(record);
}
public List<DnsRecordsetSpec> getDnsRecords() {
return records;
}
public List<LbaasMapping> getLoadBalancerRecords() {
return loadBalancerRecords;
}
@Override
public void apply(Project project, BucketData bucket, String systemKey) throws CloudException {
build(project, bucket);
dnsService.setDnsRecordsets(systemKey, project, records);
loadBalancer.setMappings(systemKey, project, loadBalancerRecords);
}
}