package com.netflix.discovery; import javax.annotation.Nullable; import java.util.Map; import com.netflix.appinfo.AmazonInfo; import com.netflix.appinfo.DataCenterInfo; import com.netflix.appinfo.InstanceInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author Nitesh Kant */ public class InstanceRegionChecker { private static Logger logger = LoggerFactory.getLogger(InstanceRegionChecker.class); private final AzToRegionMapper azToRegionMapper; private final String localRegion; InstanceRegionChecker(AzToRegionMapper azToRegionMapper, String localRegion) { this.azToRegionMapper = azToRegionMapper; this.localRegion = localRegion; } @Nullable public String getInstanceRegion(InstanceInfo instanceInfo) { if (instanceInfo.getDataCenterInfo() == null || instanceInfo.getDataCenterInfo().getName() == null) { logger.warn("Cannot get region for instance id:{}, app:{} as dataCenterInfo is null. Returning local:{} by default", instanceInfo.getId(), instanceInfo.getAppName(), localRegion); return localRegion; } if (DataCenterInfo.Name.Amazon.equals(instanceInfo.getDataCenterInfo().getName())) { AmazonInfo amazonInfo = (AmazonInfo) instanceInfo.getDataCenterInfo(); Map<String, String> metadata = amazonInfo.getMetadata(); String availabilityZone = metadata.get(AmazonInfo.MetaDataKey.availabilityZone.getName()); if (null != availabilityZone) { return azToRegionMapper.getRegionForAvailabilityZone(availabilityZone); } } return null; } public boolean isLocalRegion(@Nullable String instanceRegion) { return null == instanceRegion || instanceRegion.equals(localRegion); // no region == local } public String getLocalRegion() { return localRegion; } public AzToRegionMapper getAzToRegionMapper() { return azToRegionMapper; } }