package alien4cloud.it.provider.util;
import alien4cloud.exception.InvalidArgumentException;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.inject.Module;
import java.util.List;
import java.util.Objects;
import java.util.Properties;
import java.util.Set;
import org.jclouds.Constants;
import org.jclouds.ContextBuilder;
import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
import org.jclouds.openstack.cinder.v1.CinderApi;
import org.jclouds.openstack.cinder.v1.domain.Volume;
import org.jclouds.openstack.cinder.v1.features.VolumeApi;
import org.jclouds.openstack.keystone.v2_0.config.CredentialTypes;
import org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties;
import org.jclouds.openstack.neutron.v2.NeutronApi;
import org.jclouds.openstack.neutron.v2.domain.Network;
import org.jclouds.openstack.neutron.v2.extensions.FloatingIPApi;
import org.jclouds.openstack.neutron.v2.features.NetworkApi;
import org.jclouds.openstack.nova.v2_0.NovaApi;
import org.jclouds.openstack.nova.v2_0.domain.Address;
import org.jclouds.openstack.nova.v2_0.domain.Server;
import org.jclouds.openstack.nova.v2_0.domain.ServerCreated;
import org.jclouds.openstack.nova.v2_0.features.ServerApi;
import org.jclouds.openstack.nova.v2_0.options.CreateServerOptions;
public class OpenStackClient {
private CinderApi cinderApi;
private NovaApi novaApi;
private NeutronApi neutronApi;
private VolumeApi volumeApi;
private ServerApi serverApi;
private FloatingIPApi floatingIPApi;
private org.jclouds.openstack.nova.v2_0.extensions.FloatingIPApi novaFloatingIPApi;
private NetworkApi networkApi;
public OpenStackClient(String user, String password, String tenant, String url, String region) {
Iterable<Module> modules = ImmutableSet.<Module> of(new SLF4JLoggingModule());
Properties overrides = new Properties();
overrides.setProperty(KeystoneProperties.CREDENTIAL_TYPE, CredentialTypes.PASSWORD_CREDENTIALS);
overrides.setProperty(Constants.PROPERTY_API_VERSION, "2");
this.cinderApi = ContextBuilder.newBuilder("openstack-cinder").endpoint(url).credentials(tenant + ":" + user, password).modules(modules)
.overrides(overrides).buildApi(CinderApi.class);
if (!this.cinderApi.getConfiguredRegions().contains(region)) {
throw new InvalidArgumentException("Region " + region + " do not exist, available regions are " + cinderApi.getConfiguredRegions());
}
this.volumeApi = this.cinderApi.getVolumeApi(region);
this.novaApi = ContextBuilder.newBuilder("openstack-nova").endpoint(url).credentials(tenant + ":" + user, password).modules(modules)
.overrides(overrides).buildApi(NovaApi.class);
if (!this.novaApi.getConfiguredRegions().contains(region)) {
throw new InvalidArgumentException("Region " + region + " do not exist, available regions are " + novaApi.getConfiguredRegions());
}
this.serverApi = this.novaApi.getServerApi(region);
this.neutronApi = ContextBuilder.newBuilder("openstack-neutron").endpoint(url).credentials(tenant + ":" + user, password).modules(modules)
.overrides(overrides).buildApi(NeutronApi.class);
if (!this.neutronApi.getConfiguredRegions().contains(region)) {
throw new InvalidArgumentException("Region " + region + " do not exist, available regions are " + neutronApi.getConfiguredRegions());
}
this.floatingIPApi = this.neutronApi.getFloatingIPApi(region).get();
this.novaFloatingIPApi = this.novaApi.getFloatingIPApi(region).get();
this.networkApi = this.neutronApi.getNetworkApi(region);
}
public Volume getVolume(String id) {
return this.volumeApi.get(id);
}
public boolean deleteVolume(String id) {
return this.volumeApi.delete(id);
}
private List<Server> listServers() {
List<Server> servers = Lists.newArrayList(this.serverApi.listInDetail().concat());
return servers;
}
public Server findServerByIp(String ip) {
for (Server server : listServers()) {
for (Address address : server.getAddresses().values()) {
if (Objects.equals(address.getAddr(), ip)) {
return server;
}
}
}
return null;
}
public Server getServer(String serverId) {
return serverApi.get(serverId);
}
public boolean deleteCompute(String computeId) {
return serverApi.delete(computeId);
}
public ServerCreated create(String name, String imageRef, String flavorRef, CreateServerOptions... options) {
return serverApi.create(name, imageRef, flavorRef, options);
}
public Set<String> getServerNetworksNames(Server server) {
if (server != null) {
if (server.getAddresses() != null) {
return server.getAddresses().keySet();
}
}
return null;
}
public Network findNetworkByName(String name) {
FluentIterable<Network> networks = networkApi.list().concat();
for (Network network : networks) {
if (Objects.equals(network.getName(), name)) {
return network;
}
}
return null;
}
public org.jclouds.openstack.nova.v2_0.domain.FloatingIP associateFloationgIpToServer(String serverId, String poolName) {
org.jclouds.openstack.nova.v2_0.domain.FloatingIP floatingIp = novaFloatingIPApi.allocateFromPool(poolName);
novaFloatingIPApi.addToServer(floatingIp.getIp(), serverId);
return floatingIp;
}
public void deleteFloatingIp(String id) {
floatingIPApi.delete(id);
}
}