Switch ipresolver to always be defined in the storage context

We now use a no-op IP resolver instead of an IF check

Fixes https://jira.prod.coreos.systems/browse/QS-38
This commit is contained in:
Joseph Schorr 2017-10-17 14:29:40 -04:00
parent 5dfa46ed56
commit 8194f5cf72
3 changed files with 27 additions and 3 deletions

View file

@ -4,6 +4,7 @@ from storage.fakestorage import FakeStorage
from storage.distributedstorage import DistributedStorage from storage.distributedstorage import DistributedStorage
from storage.swift import SwiftStorage from storage.swift import SwiftStorage
from storage.downloadproxy import DownloadProxy from storage.downloadproxy import DownloadProxy
from util.ipresolver import NoopIPResolver
STORAGE_DRIVER_CLASSES = { STORAGE_DRIVER_CLASSES = {
'LocalStorage': LocalStorage, 'LocalStorage': LocalStorage,
@ -33,7 +34,7 @@ class StorageContext(object):
self.metric_queue = metric_queue self.metric_queue = metric_queue
self.chunk_cleanup_queue = chunk_cleanup_queue self.chunk_cleanup_queue = chunk_cleanup_queue
self.config_provider = config_provider self.config_provider = config_provider
self.ip_resolver = ip_resolver self.ip_resolver = ip_resolver or NoopIPResolver()
class Storage(object): class Storage(object):

View file

@ -622,7 +622,7 @@ class CloudFrontedS3Storage(S3Storage):
resolved_ip_info = None resolved_ip_info = None
logger.debug('Got direct download request for path "%s" with IP "%s"', path, request_ip) logger.debug('Got direct download request for path "%s" with IP "%s"', path, request_ip)
if request_ip is not None and self._context.ip_resolver is not None: if request_ip is not None:
# Lookup the IP address in our resolution table and determine whether it is under AWS. # Lookup the IP address in our resolution table and determine whether it is under AWS.
# If it is, then return an S3 signed URL, since we are in-network. # If it is, then return an S3 signed URL, since we are in-network.
resolved_ip_info = self._context.ip_resolver.resolve_ip(request_ip) resolved_ip_info = self._context.ip_resolver.resolve_ip(request_ip)

View file

@ -2,6 +2,9 @@ import logging
import json import json
import requests import requests
from abc import ABCMeta, abstractmethod
from six import add_metaclass
from cachetools import ttl_cache, lru_cache from cachetools import ttl_cache, lru_cache
from collections import namedtuple, defaultdict from collections import namedtuple, defaultdict
from netaddr import IPNetwork, IPAddress, IPSet, AddrFormatError from netaddr import IPNetwork, IPAddress, IPSet, AddrFormatError
@ -9,6 +12,8 @@ from netaddr import IPNetwork, IPAddress, IPSet, AddrFormatError
import geoip2.database import geoip2.database
import geoip2.errors import geoip2.errors
from util.abchelpers import nooper
ResolvedLocation = namedtuple('ResolvedLocation', ['provider', 'region', 'service', 'sync_token']) ResolvedLocation = namedtuple('ResolvedLocation', ['provider', 'region', 'service', 'sync_token'])
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -28,7 +33,25 @@ def update_resolver_datafiles():
f.write(response.text) f.write(response.text)
logger.debug('Successfully wrote %s', filename) logger.debug('Successfully wrote %s', filename)
class IPResolver(object):
@add_metaclass(ABCMeta)
class IPResolverInterface(object):
""" Helper class for resolving information about an IP address. """
@abstractmethod
def resolve_ip(self, ip_address):
""" Attempts to return resolved information about the specified IP Address. If such an attempt
fails, returns None.
"""
pass
@nooper
class NoopIPResolver(IPResolverInterface):
""" No-op version of the security scanner API. """
pass
class IPResolver(IPResolverInterface):
def __init__(self, app): def __init__(self, app):
self.app = app self.app = app
self.geoip_db = geoip2.database.Reader('util/ipresolver/GeoLite2-Country.mmdb') self.geoip_db = geoip2.database.Reader('util/ipresolver/GeoLite2-Country.mmdb')