package io.fathom.cloud.lbaas.backend.selfhosted;
import io.fathom.cloud.CloudException;
import io.fathom.cloud.lbaas.backend.LbaasBackendBase;
import io.fathom.cloud.lbaas.services.Escaping;
import io.fathom.cloud.openstack.client.loadbalance.model.LbaasMapping;
import io.fathom.cloud.openstack.client.loadbalance.model.LoadBalanceMappingList;
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.List;
import java.util.Map;
import java.util.concurrent.Callable;
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 SelfHostedLbaasBackend extends LbaasBackendBase {
@Inject
TaskScheduler taskScheduler;
@Inject
StorageService storageService;
@Inject
Gson gson;
@Override
public void updateHost(Project project, String host) {
UpdateSelfHosted task = new UpdateSelfHosted(project, host);
taskScheduler.execute(task);
}
public class UpdateSelfHosted implements Callable<Void> {
private final Project project;
private final String host;
public UpdateSelfHosted(Project project, String host) {
this.project = project;
this.host = host;
}
@Override
public Void call() throws CloudException, IOException {
LoadBalanceMappingList data = new LoadBalanceMappingList();
List<LbaasMapping> mappings = lbaas.listMappings(project, host);
data.mappings = mappings;
String path = "__default/lb/data/" + Escaping.escape(host);
String bucket = "__services";
String contents = gson.toJson(data);
ByteSource bytes = ByteSource.wrap(contents.getBytes(Charsets.UTF_8));
String contentType = "application/json";
Map<String, String> userAttributes = null;
storageService.getFileService().putFile(project, bucket, path, FileBlob.build(bytes), contentType,
userAttributes);
return null;
}
}
}