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.Address; import org.openstack4j.model.compute.Server; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import com.sequenceiq.cloudbreak.cloud.model.CloudInstanceMetaData; @Component public class ComputeApiExtractor implements CloudInstanceMetaDataExtractor { private static final Logger LOGGER = LoggerFactory.getLogger(ComputeApiExtractor.class); @Inject private HypervisorExtractor hypervisorExtractor; @Override public CloudInstanceMetaData extractMetadata(OSClient client, Server server, String instanceId) { String hypervisor = hypervisorExtractor.getHypervisor(server); String privateIp = null; String floatingIp = null; Map<String, List<? extends Address>> adrMap = server.getAddresses().getAddresses(); LOGGER.debug("Address map: {} of instance: {}", adrMap, server.getName()); for (String key : adrMap.keySet()) { LOGGER.debug("Network resource key: {} of instance: {}", key, server.getName()); List<? extends Address> adrList = adrMap.get(key); for (Address adr : adrList) { LOGGER.debug("Network resource key: {} of instance: {}, address: {}", key, server.getName(), adr); switch (adr.getType()) { case "fixed": privateIp = adr.getAddr(); LOGGER.info("PrivateIp of instance: {} is {}", server.getName(), privateIp); break; case "floating": floatingIp = adr.getAddr(); LOGGER.info("FloatingIp of instance: {} is {}", server.getName(), floatingIp); break; default: LOGGER.error("No such network resource type: {}, instance: {}", adr.getType(), server.getName()); } } } return new CloudInstanceMetaData(privateIp, floatingIp, hypervisor); } }