Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/uploaders/object_storage/cdn/google_ip_cache.rb')
-rw-r--r--app/uploaders/object_storage/cdn/google_ip_cache.rb60
1 files changed, 60 insertions, 0 deletions
diff --git a/app/uploaders/object_storage/cdn/google_ip_cache.rb b/app/uploaders/object_storage/cdn/google_ip_cache.rb
new file mode 100644
index 00000000000..35ec7ce0c6e
--- /dev/null
+++ b/app/uploaders/object_storage/cdn/google_ip_cache.rb
@@ -0,0 +1,60 @@
+# rubocop:disable Naming/FileName
+# frozen_string_literal: true
+
+module ObjectStorage
+ module CDN
+ class GoogleIpCache
+ GOOGLE_CDN_LIST_KEY = 'google_cdn_ip_list'
+ CACHE_EXPIRATION_TIME = 1.day
+
+ class << self
+ def update!(subnets)
+ caches.each { |cache| cache.write(GOOGLE_CDN_LIST_KEY, subnets) }
+ end
+
+ def ready?
+ caches.any? { |cache| cache.exist?(GOOGLE_CDN_LIST_KEY) }
+ end
+
+ def google_ip?(request_ip)
+ google_ip_ranges = cached_value(GOOGLE_CDN_LIST_KEY)
+
+ return false unless google_ip_ranges
+
+ google_ip_ranges.any? { |range| range.include?(request_ip) }
+ end
+
+ def async_refresh
+ ::GoogleCloud::FetchGoogleIpListWorker.perform_async
+ end
+
+ private
+
+ def caches
+ [l1_cache, l2_cache]
+ end
+
+ def l1_cache
+ Gitlab::ProcessMemoryCache.cache_backend
+ end
+
+ def l2_cache
+ Rails.cache
+ end
+
+ def cached_value(key)
+ l1_cache.fetch(key) do
+ result = l2_cache.fetch(key)
+
+ # Don't populate the L1 cache if we can't find the entry
+ break unless result
+
+ result
+ end
+ end
+ end
+ end
+ end
+end
+
+# rubocop:enable Naming/FileName