package com.sequenceiq.cloudbreak.cloud.openstack.metadata; import java.util.List; import java.util.Map; import javax.inject.Inject; import org.openstack4j.api.OSClient; import org.openstack4j.model.compute.Server; import org.openstack4j.model.network.NetFloatingIP; import org.openstack4j.model.network.Port; import org.openstack4j.model.network.options.PortListOptions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import com.google.common.collect.Maps; import com.sequenceiq.cloudbreak.cloud.model.CloudInstanceMetaData; @Component public class PortApiExtractor implements CloudInstanceMetaDataExtractor { private static final Logger LOGGER = LoggerFactory.getLogger(PortApiExtractor.class); @Inject private HypervisorExtractor hypervisorExtractor; @Override public CloudInstanceMetaData extractMetadata(OSClient client, Server server, String instanceId) { String hypervisor = hypervisorExtractor.getHypervisor(server); LOGGER.debug("Address map was empty, trying to extract ips"); List<? extends Port> ports = client.networking().port().list(getPortListOptions(instanceId)); String portId = ports.get(0).getId(); List<? extends NetFloatingIP> floatingIps = client.networking().floatingip().list(getFloatingIpListOptions(portId)); NetFloatingIP ips = floatingIps.get(0); LOGGER.info("PrivateIp of instance: {} is {}", server.getName(), ips.getFixedIpAddress()); LOGGER.info("FloatingIp of instance: {} is {}", server.getName(), ips.getFloatingIpAddress()); return new CloudInstanceMetaData(ips.getFixedIpAddress(), ips.getFloatingIpAddress(), hypervisor); } private PortListOptions getPortListOptions(String instanceId) { return PortListOptions.create().deviceId(instanceId); } private Map<String, String> getFloatingIpListOptions(String portId) { Map<String, String> paramMap = Maps.newHashMap(); paramMap.put("port_id", portId); return paramMap; } }