/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package at.ac.tuwien.dsg.cloud.elise.openstackcollector; import at.ac.tuwien.dsg.cloud.elise.collectorinterfaces.UnitInstanceCollector; import at.ac.tuwien.dsg.cloud.elise.model.runtime.LocalIdentification; import at.ac.tuwien.dsg.cloud.elise.model.runtime.UnitInstance; import at.ac.tuwien.dsg.cloud.salsa.domainmodels.IaaS.VirtualMachineInfo; import at.ac.tuwien.dsg.cloud.salsa.domainmodels.IaaS.VirtualMachineInfo.State; import at.ac.tuwien.dsg.cloud.salsa.domainmodels.types.ServiceCategory; import com.google.common.collect.Multimap; import java.net.InetAddress; import java.util.Collection; import java.util.HashSet; import java.util.Set; import org.jclouds.ContextBuilder; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.openstack.nova.v2_0.NovaApi; import org.jclouds.openstack.nova.v2_0.NovaApiMetadata; 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.Server.Status; import org.jclouds.openstack.nova.v2_0.extensions.VolumeApi; import org.jclouds.openstack.nova.v2_0.features.ServerApi; import org.jclouds.rest.RestContext; /** * * @author Duc-Hung LE */ public class Main extends UnitInstanceCollector { static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(Main.class); NovaApi client; ServerApi serverApi; VolumeApi volumeApi; String keyName; final String region = "myregion"; @Override public Set<UnitInstance> collectAllInstance() { init(); Set<UnitInstance> instances = new HashSet<>(); System.out.println("Servers in myregion"); for (Server server : this.serverApi.listInDetail().concat()) { UnitInstance instance = openstackServerToVMInfo(server); if (instance != null) { instances.add(instance); } } return instances; } @Override public UnitInstance collectInstanceByID(String domainID) { init(); return openstackServerToVMInfo(this.serverApi.get(domainID)); } private UnitInstance openstackServerToVMInfo(Server server) { if (server == null) { return null; } logger.debug("Found server: " + server.getName()); VirtualMachineInfo vmInfo = new VirtualMachineInfo(readAdaptorConfig(OpenStackParameterStrings.END_POINT.getString()), server.getId(), server.getName()); vmInfo.setBaseImageID(server.getImage().getId()); vmInfo.setBaseImageName(server.getImage().getName()); vmInfo.setConfigDrive(server.getConfigDrive()); vmInfo.setFlavorID(server.getFlavor().getId()); vmInfo.setFlavorName(server.getFlavor().getName()); vmInfo.setHostId(server.getHostId()); vmInfo.setInstanceId(server.getUuid()); vmInfo.setKeyname(server.getKeyName()); vmInfo.setStatus(server.getStatus().value()); vmInfo.setTenantId(server.getTenantId()); vmInfo.setUpdated(server.getUpdated().toString()); vmInfo.setUserID(server.getUserId()); vmInfo.setCurrentState(keyName); Multimap<String, Address> addresses = server.getAddresses(); Collection<Address> ips = addresses.get("private"); for (Address a : ips) { String ip = a.getAddr(); logger.debug("FOUND AN ADDRESS: " + ip); InetAddress inet; try { inet = InetAddress.getByName(ip); if (inet.isSiteLocalAddress()) { logger.debug("FOUND AN LOCAL ADDRESS: " + ip); vmInfo.setPrivateIp(ip); } else { logger.debug("FOUND AN PUBLIC ADDRESS: " + ip); vmInfo.setPublicIp(ip); } } catch (java.net.UnknownHostException ex) { logger.error("Error when parsing IP addresses: {}" + ex.getMessage()); ex.printStackTrace(); } } UnitInstance instance = new UnitInstance(server.getName(), ServiceCategory.VirtualMachine); instance.setDomainInfo(vmInfo.toJson()); return instance; } private State convertOpenstackStatusToVMDomainState(Status status) { if (status == null) { return State.unknown; } switch (status) { case BUILD: case REBUILD: return State.spawning; case REBOOT: case RESIZE: return State.configuring; case ACTIVE: return State.running; case PAUSED: case SUSPENDED: case STOPPED: return State.stopped; case ERROR: return State.error; default: return State.unknown; } } @Override public LocalIdentification identify(UnitInstance paramUnitInstance) { String domainInfo = paramUnitInstance.getDomainInfo(); VirtualMachineInfo vmInfo = (VirtualMachineInfo) VirtualMachineInfo.fromJson(domainInfo); LocalIdentification local = new LocalIdentification(ServiceCategory.VirtualMachine, this.getName()); local.hasIdentification("ip", vmInfo.getPrivateIp()); return local; } @Override public String getName() { return "OpenstackCollector"; } private void init() { System.out.println("THIS IS ON THE SCREEN !!!"); logger.info("Reading configuration file ..."); String tenant = readAdaptorConfig(OpenStackParameterStrings.TENANT.getString()); String username = readAdaptorConfig(OpenStackParameterStrings.USERNAME.getString()); String password = readAdaptorConfig(OpenStackParameterStrings.PASSWORD.getString()); String endpoint = readAdaptorConfig(OpenStackParameterStrings.KEYSTONE_ENDPOINT.getString()); logger.debug("Tenant: " + tenant); logger.debug("Username: " + username); logger.debug("Password: " + password); logger.debug("Endpoint: " + endpoint); ComputeServiceContext context = (ComputeServiceContext) ContextBuilder.newBuilder("openstack-nova").credentials(tenant + ":" + username, password).endpoint(endpoint).buildView(ComputeServiceContext.class); this.client = ((NovaApi) ((RestContext) context.unwrap(NovaApiMetadata.CONTEXT_TOKEN)).getApi()); this.serverApi = this.client.getServerApiForZone("myregion"); logger.info("Done initiation !"); } }